【问题标题】:Embed COM type library resouce (TLB) in MinGW-built DLL在 MinGW-build DLL 中嵌入 COM 类型库资源 (TLB)
【发布时间】:2013-10-30 19:49:53
【问题描述】:

我有一个使用midl 构建的 COM 类型库,称之为“mylib.tlb”。我想将它嵌入到一个 DLL “mylib.dll”中,它是用 MinGW 编译和链接的。 DLL“mylib.dll”还包含一个函数myfunc()。我希望能够将“mylib.tlb”作为资源嵌入“mylib.dll”中,以便myfunc()(也在“mylib.dll”中)可以使用COM函数@987654324加载“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_CANTLOADLIBRARY。我不知道这是因为它根本无法加载 DLL,还是因为它在 DLLwithin 中找不到类型库。我已经验证我的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 中?

【问题讨论】:

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


    【解决方案1】:

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

    所以我在做:

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

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

    见:

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-11-24
      • 2010-09-29
      • 1970-01-01
      • 2012-03-29
      • 1970-01-01
      • 2016-01-15
      • 2010-09-25
      • 1970-01-01
      相关资源
      最近更新 更多