2011-09-18 70 views
0

我在我的C#.Net應用程序中使用外部原生COM組件。如何管理.Net的RCW COM對象創建參數(即請求的接口)?

這個COM DLL沒有類型庫,所以我不得不自己編寫互操作代碼,並且有像TlbImp那樣的include/idl文件。 但是最糟糕的事情是,對象的創建失敗:

創建具有CLSID {40700425-0080-11D2-851F-00C04FC21759}的COM組件的實例從IClassFactory的失敗,原因是以下錯誤:80040111

如果我使用本機CoCreateInstance並指定class_id和其中一個已實現的接口iids,則該類將很好地創建。

事實證明問題在於COM對象的IClassFactory :: CreateInstance不支持IID_IUnknown作爲riid參數傳遞,因此返回CLASS_E_CLASSNOTAVAILABLE(我用反彙編器和調試器識別它)。該組件是MS SQL VDI。

有什麼辦法強制.Net RCW傳遞不同的接口ID到CreateInstance方法而不是IID_IUnknown? 搜索了很多,但沒有找到解決方案。

作爲一種解決方法,我正在使用C++/CLI來請求合適的接口而不是IID_IUnknown來對象化。爲此目的,但希望在C#中有代碼,因爲C++/CLI需要我爲每個平臺構建不同的DLL。

謝謝

+0

無法從CoCreateInstance()響應IUnknown是一個錯誤。你能否讓外部圖書館的所有者修復它? http://blogs.msdn.com/b/oldnewthing/archive/2004/03/26/96777.aspx –

+0

所有者是微軟,由於這個bug已經存在超過10年,並考慮到它不會不會阻止組件使用我不認爲該補丁可用 – mistika

+0

哦,哇。棒極了。 –

回答

0

我repro。 Brr,痛苦。您可以鎖定CoCreateInstance:

[return: MarshalAs(UnmanagedType.Interface)] 
[DllImport("ole32.dll", ExactSpelling=true, PreserveSig=false)] 
public static extern object CoCreateInstance(ref Guid clsid, 
    [MarshalAs(UnmanagedType.Interface)] object punkOuter, int context, ref Guid iid); 
+0

謝謝你的建議,漢斯。它的伎倆,簡單的說唱歌手將隱藏它。雖然有這樣的東西會很好(編輯 - 上帝,如何在註釋中張貼換行符?NBoth Enter和CtrlEnter按下Save按鈕)。 ...類似於:[DefaultInterfaceGuid(「XXXX-XXX-XXX」)]左右。 – mistika

+0

您可以使用'引用代碼。 –