我有一個用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中?