C++ 在MinGW构建的DLL中嵌入COM类型库资源(TLB)

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

我有一个用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 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
  • 我在原则上做错什么了吗
编辑:我注意到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?

问题是MinGW链接器只能处理一个包含资源的对象文件。它从第一个资源中取出资源,并忽略所有其他资源

所以我在做:

$ g++ -o mylib.dll -shared main_resources.o myres.o
其中“myres.o”包含TLB。如果在命令行上反转对象的顺序,则DLL包含TLB而不包含任何其他资源。除此之外,我在问题部分的代码运行良好

见: