2013-10-22 30 views
0

我有一個用midl構建的COM類型庫,稱之爲「mylib.tlb」。我想將它嵌入到一個DLL中,「mylib.dll」被編譯並與MinGW鏈接。 DLL「mylib.dll」還包含一個功能myfunc()。我希望能夠將「mylib.tlb」作爲「mylib.dll」中的資源嵌入,以便「mylib.dll」—中的myfunc() —可以使用COM函數LoadTypeLibEx()加載「mylib.tlb」。在MinGW構建的DLL中嵌入COM類型庫資源(TLB)

換句話說:

void myfunc() // a function living within "mylib.dll" 
{ 
    // ... 
    ITypeLib * result(0); 
    HRESULT hr = LoadTypeLibEx(path_to_this_dll, REGKIND_NONE, &result); 
    // should successfully load "mylib.tlb" into result!!! 
} 

這不是爲我工作,我不知道爲什麼。 LoadTypeLibEx()正在返回-2147312566 = 0x80029c4a = TYPE_E_CANTLOADLIBRARY。我不知道這是因爲它根本無法加載DLL,或者它無法在的DLL中找到類型庫。我已經驗證我的path_to_this_dll變量包含「mylib.dll」的路徑,所以我希望它是後者。

我想建立 「mylib.tlb」 到 「中是指mylib.dll」 使用下面的MinGW工具的命令行:

$ windres myres.rc myres.o 
$ ar rcs mylib.a a.o b.o ... myres.o ... x.o 
$ g++ -o mylib.dll -shared ... mylib.a ... 

其中 「myres.rc」 只是看起來像這樣:

1000 typelib "mylib.tlb" 

當我構建「mylib.dll」時,我可以使用名爲ResourceHacker的程序來驗證它是否包含其他一些資源(圖標,光標等),但是我無法從ResourceHacker知道TLB是否生成了它進入DLL。

  • 我的資源腳本(「myres.rc」)正確嗎?
  • 我可以使用其他哪些資源工具來檢查TLB是否將其加入DLL中?
  • 我原則上做錯了什麼?

編輯:我注意到,TLB文件包含字符串「MIDL」,所以我試圖grepping的是,在各種文件。不知怎的,類型庫資源沒有進入DLL:

$ grep MIDL mylib.tlb 
Binary file mylib.tlb matches 
$ grep MIDL myres.o 
Binary file myres.o matches 
$ grep MIDL mylib.a 
Binary file mylib.a matches 
$ grep MIDL mylib.dll 
$ echo $? 
1 

爲什麼鏈接器不會將TLB資源放入DLL中?

回答

0

問題是MinGW鏈接器只能處理一個包含資源的對象文件。它從第一個資源中取出資源,忽略所有其他資源。

所以我在做什麼:

$ g++ -o mylib.dll -shared main_resources.o myres.o 

其中 「myres.o」 包含了TLB。如果我顛倒命令行上對象的順序,則DLL包含TLB,而不包含其他資源。除此之外,我在問題部分的代碼工作正常。

參見:

相關問題