2013-10-22 33 views
0

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

回答

0

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

所以我在做什么:

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

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

参见:

相关问题