2013-03-03 88 views
2

請幫助使用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

回答

2

看來你的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