2011-08-10 65 views
1

我有一個沒有嵌入類型庫的VB6標準EXE。我想從該可執行文件生成一個互操作程序集,並從.NET項目中引用它。這應該允許我從.NET中實例化可執行文件中定義的COM類。.NET項目的無參考類型COM EXE

由於我沒有類型庫,我嘗試從頭開始創建IDL,使用MIDL生成typelib,並從typelib生成了一個interop程序集。我可以從我的.NET項目中引用互操作程序集,但仍不能實例化任何COM類。我相信我的互操作程序集不知道EXE,因此實際上不能執行我調用的代碼。

我已經在.NET中成功實例化了VB6中定義的COM類ActiveX DLL,其中互操作程序集知道包含實現的相應COM DLL的ClassID。

在我從頭開始創建的IDL中,我應該使用什麼作爲庫定義的UUID?這是否應該以某種方式引用EXE?

[ 
    uuid(WHATUUID-SHOU-LDII-NCLU-DEHEREXXXXXX), 
    version(1.0), 
    helpstring("for TLB on EXE") 
] 
library MyExe { ... } 

Thesequestions接近,但我仍然堅持。我正在嘗試做什麼?我寧願避免遲到的約束。謝謝你的幫助。

回答

2

互操作庫不應該知道EXE,這就是COM的工作原理。這是CLSID鍵,它告訴服務器應該如何啓動。 InProcServer32與LocalServer32。

當你編寫自己的IDL時,有一百萬件事情可能會出錯。如果你沒有類型庫,猜測接口和類的正確指導是非平凡的。如果你弄錯了,那麼你不能創建COM類。我很確定類型庫是嵌入在vb6 ActiveX .exes中的,我沒有記住沒有嵌入它的選項。要驗證,請使用Visual Studio的File + Open + File並選擇.exe。你會得到嵌入式資源,如果你看到TYPELIB,你會很高興。打開節點,右鍵單擊ID 1並使用「導出」將其導出到.tlb文件。

+1

+1我99.9%確定類型庫*總是*嵌入VB6 ActiveX EXE – MarkJ

+0

我剛剛編輯我的問題,以澄清它是VB6標準EXE,而不是ActiveX EXE。當我打開EXE時,Visual Studio確實沒有顯示類型庫。 – pizza247

+0

你試圖做的事情是不可能的,只有一個ActiveX EXE可以被客戶端程序使用。我無法猜測你可能用作IDL源的東西。 –