导入和调用COM DLL
请帮助使用ATL COM DLL方法在C#应用程序导入和调用COM DLL
在ATLLib.idl
...
interface IATLLibMain : IUnknown{
[helpstring("method hello")] HRESULT hello([out,retval] BSTR* res);
};
...
在ATLLibMain.cpp
(ATL SimpleObject
类)
STDMETHODIMP CATLLibMain::hello(BSTR* res)
{
*res = SysAllocString(L"Hello world!!!");
return S_OK;
}
我编译并注册了COM。 在C#项目,添加引用ATLLib.dll并试图调用方法这样
IATLLibMain atllib = new ATLLibMainClass();
Console.WriteLine(atllib.hello());
和VS给出错误
System.Runtime.InteropServices.COMException
类型的未处理的异常出现在ATLLibTest.exe。检索COM类工厂组件具有CLSID {...}失败,原因是下面的错误80040154
上线
IATLLibMain atllib = new ATLLibMainClass();
请说明使用ATL DLL任何项目样本在C#应用程序或帮助修复此错误? 谢谢...
看来你的C#代码运行在64位模式下,它不能加载32位非托管代码。
从任何CPU到 C#应用程序的变化平台目标。
此外,注册使用REGSVR32的32位版本的库(见Error Message When You Run Regsvr32.exe on 64-Bit Windows):
%windir%\SysWoW64\regsvr32.exe C:\path\to\library.dll
但是我的C#项目的_Platform Target_已经设置为_x86_ – 2013-03-03 15:00:37
@ErikKianu,请参阅更新(关于库注册)。 – 2013-03-03 16:42:30
谢谢@Sergey,但仍然是相同的结果...%windir%\ SysWoW64 \ regsvr32%windir%\ System32 \ regsvr32.exe/u C:\ path \ to \ library.dll .exe C:\ path \ to \ library.dll'结果不是。 – 2013-03-04 11:18:15
你得到有关异常的比这更好的方式。 Message和ErrorCode属性对于诊断异常很重要。只需将消息字符串粘贴到搜索框中,您就很可能找到答案。 – 2013-03-03 13:09:01
直到您还向我们显示异常的确切错误消息(每个异常都有Message属性)以及堆栈跟踪之前,都不可能分辨出来。也许你忘记了一些改变后重新注册你的COM DLL? – 2013-03-03 15:16:46
'检索COM类工厂具有CLSID {...}组件未能由于以下错误80040154.' 上线 'IATLLibMain atllib =新ATLLibMainClass();' – 2013-03-03 16:19:21