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