C++ 在MinGW构建的DLL中嵌入COM类型库资源(TLB)
我有一个用midl构建的COM类型库,称之为“mylib.tlb”。我想把它嵌入到一个DLL“mylib.DLL”中,这个DLL是用MinGW编译和链接的。DLL“mylib.DLL”还包含一个函数C++ 在MinGW构建的DLL中嵌入COM类型库资源(TLB),c++,dll,com,mingw,embedded-resource,C++,Dll,Com,Mingw,Embedded Resource,我有一个用midl构建的COM类型库,称之为“mylib.tlb”。我想把它嵌入到一个DLL“mylib.DLL”中,这个DLL是用MinGW编译和链接的。DLL“mylib.DLL”还包含一个函数myfunc()。我希望能够将“mylib.tlb”作为一个资源嵌入到“mylib.dll”中,以便myfunc()(也在“mylib.dll”中)可以使用COM函数LoadTypeLibEx()加载“mylib.tlb” 换言之: void myfunc() // a function living
myfunc()
。我希望能够将“mylib.tlb”作为一个资源嵌入到“mylib.dll”中,以便myfunc()
(也在“mylib.dll”中)可以使用COM函数LoadTypeLibEx()
加载“mylib.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\u CANTLOADLIBRARY
。我不知道这是因为它根本无法加载DLL,还是因为它在DLL中找不到类型库。我已经验证了我的path\u to\u这个\u dll
变量包含指向“mylib.dll”的路径,所以我希望是后者
我正在尝试使用以下MinGW工具命令行将“mylib.tlb”构建到“mylib.dll”中:
$ 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
- 我在原则上做错什么了吗
$ 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?问题是MinGW链接器只能处理一个包含资源的对象文件。它从第一个资源中取出资源,并忽略所有其他资源 所以我在做:
$ g++ -o mylib.dll -shared main_resources.o myres.o
其中“myres.o”包含TLB。如果在命令行上反转对象的顺序,则DLL包含TLB而不包含任何其他资源。除此之外,我在问题部分的代码运行良好
见: