在MinGW-build DLL中嵌入COM类型库资源(TLB)

时间:2013-10-22 05:11:58

标签: c++ dll com mingw embedded-resource

我有一个用midl构建的COM类型库,称之为“mylib.tlb”。我想将它嵌入一个DLL,“mylib.dll”,它与MinGW编译和链接。 DLL“mylib.dll”还包含函数myfunc()。我希望能够将“mylib.tlb”作为“mylib.dll”中的资源嵌入,以便myfunc() - 也在“mylib.dll”中 - 可以使用COM函数加载“mylib.tlb” LoadTypeLibEx()

换句话说:

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”的路径,所以我希望它是后者。

我正在尝试使用以下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?

1 个答案:

答案 0 :(得分:0)

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

所以我在做:

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

其中“myres.o”包含TLB。如果我在命令行上反转对象的顺序,则DLL包含TLB而不包含其他资源。除此之外,我在问题部分的代码工作正常。

请参阅: