导入和调用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#应用程序或帮助修复此错误? 谢谢...

+0

你得到有关异常的比这更好的方式。 Message和ErrorCode属性对于诊断异常很重要。只需将消息字符串粘贴到搜索框中,您就很可能找到答案。 – 2013-03-03 13:09:01

+0

直到您还向我们显示异常的确切错误消息(每个异常都有Message属性)以及堆栈跟踪之前,都不可能分辨出来。也许你忘记了一些改变后重新注册你的COM DLL? – 2013-03-03 15:16:46

+0

'检索COM类工厂具有CLSID {...}组件未能由于以下错误80040154.' 上线 'IATLLibMain atllib =新ATLLibMainClass();' – 2013-03-03 16:19:21

看来你的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 
+0

但是我的C#项目的_Platform Target_已经设置为_x86_ – 2013-03-03 15:00:37

+0

@ErikKianu,请参阅更新(关于库注册)。 – 2013-03-03 16:42:30

+0

谢谢@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