如何从非托管COM DLL生成类型库

时间:2011-02-14 08:19:30

标签: c++ com unmanaged regsvr32 typelib

我必须在我的.NET应用程序中使用第三方非托管COM dll。我需要修改此程序集以生成custom RCW。为了Edit Interop Assembly,我需要特定程序集的类型库。任何人都可以向我解释如何从非托管COM dll生成类型库?

regsvr32中没有选项来生成类型库。

谢谢你, 最好的祝福, 机器人。

5 个答案:

答案 0 :(得分:14)

您需要OLE-COM Object Viewer,这是最新Windows SDK内容的一部分。然后,您可以转到File-> View Type Lib并将IDL保存到文本文件中。然后,您可以使用MIDL(也是Windows SDK的一部分)重新生成TLB和头文件。这样的事情应该适用于基本情况:

midl /out c:\temp /header MyHeader.h MyIDLFile.idl

答案 1 :(得分:6)

如果你要做的就是从本机dll创建一个Interop程序集(并且本机DLL将TLB作为资源嵌入),你可以直接在dll上调用tlbimp:

tlbimp Foo.dll /out:Interop.Foo.dll

这将生成Interop.Foo.dll。然后,您可以使用ildasm修改IL:

ildasm Interop.Foo.dll /out=Foo.il

答案 2 :(得分:5)

如果只有COM DLL,则无法生成类型库。类型库描述了实现的COM接口。但是,非托管COM DLL只需要公开DllGetClassObject。这只会给你一个IClassFactory,如果你事先知道正确的类型,你可以创建新对象。

答案 3 :(得分:5)

如果类型库嵌入在DLL资源中并且TLB文件本身是必需的,那么第三方软件可以提取它(但是,正如其他人所指出的,这可能不是最理想的选项)。

E.g。使用Resource Hacker

  1. 打开DLL文件。
  2. 导航到树视图中的TYPELIB \ 1 \ 1033(或其他)节点。
  3. 从菜单中选择操作 - >将资源另存为二进制文件...
  4. 选择文件名并为其提供.TLB扩展名。
  5. 您现在可以引用该.TLB文件并构建而无需原始DLL,例如

    #import "test.tlb" named_guids
    

答案 4 :(得分:3)

Visual Studio IDE可以直接从非托管的.exe和.dll文件中提取二进制资源。 如果类型库在非托管 COM DLL(例如使用VS本机C ++编译器构建的COM DLL)中保存为二进制资源,则可以按如下方式提取它:

  1. 在VS 资源编辑器(打开可执行文件时的默认编辑器)中打开.dll文件。
  2. 导航到资源树中的类型库资源("TYPELIB",然后1)。
  3. 右键单击类型库资源,然后选择export。这会打开一个“将文件另存为”对话框。
  4. 在“将文件另存为”框中,将文件名从默认值(通常为bin1.bin)更改为MyLibrary.tlb,然后单击“确定”。
  5. 使用OleView.exe打开导出的.tlb文件进行确认(结果应与您使用OleView.exe打开.dll时看到的结果相同)。
  6. 要从托管 DLL(例如,使用C#构建的DLL)中提取类型库,VS包含工具Tlbexp.exe(从VS命令提示符运行它): https://msdn.microsoft.com/en-us/library/hfzzah2c(v=vs.110).aspx