未提供COM + dll时获取IDL(用于TLB)

Pau*_*opf 5 c++ com idl typelib midl

我有一个.dll,其中包含一些带有特定/自定义界面的DirectShow筛选器(COM)进行查询。

大多数第三方DirectShow组件都包含嵌入式.tlb文件,这些文件可用于跨环境通信(C#typelib导入)。

我不想尝试手动创建c#所需的接口,因为没有提供idl / tlb文件。

是否可以从COM .dll生成tlb(或至少是idl,我可以MIDL编译)?

小智 6

是的,可以对IDL(或与其非常接近的东西)进行反向工程/拆卸。您需要做的是给自己一个新的C ++控制台项目,该项目提供的默认代码为

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

然后在#include语句下插入#import语句。因此,我一直在玩C#程序集,将其标记为COM Interop DLL,我将其称为ComExample2,它与我添加的C ++控制台项目位于同一解决方案中,这意味着我可以使用一个不错的相对路径名。所以我的#import语句看起来像

#import "..\ComExample2\bin\Debug\ComExample2.tlb" no_namespace named_guids
Run Code Online (Sandbox Code Playgroud)

然后,您构建控制台应用程序。如果深入研究在生成过程中生成的文件,您将找到一个以.TLH结尾的文件,该文件代表类型库头。所以我的路是

..\ComExample2\ConsoleApplication1\Debug\comexample2.tlh
Run Code Online (Sandbox Code Playgroud)

我文件中的内容非常类似于idl。这是一段经过编辑的片段,可为您带来风味。...

struct __declspec(uuid("515b1b18-1602-4d42-b743-f1b3c458a0d0"))
/* LIBID */ __ComExample2;
struct /* coclass */ ComExampleClass2;

//
// Type library items
//

struct __declspec(uuid("713007fe-e74c-4fec-b91a-5ef8df279929"))
IFoo : IDispatch
{
    //
    // Wrapper methods for error-handling
    //

    _bstr_t Greeting ( );
    long Sim (
        long a,
        long b );

    //
    // Raw methods provided by interface
    //

      virtual HRESULT __stdcall raw_Greeting (
        /*[out,retval]*/ BSTR * pRetVal ) = 0;
      virtual HRESULT __stdcall raw_Sim (
        /*[in]*/ long a,
        /*[in]*/ long b,
        /*[out,retval]*/ long * pRetVal ) = 0;
};

struct __declspec(uuid("efe233b5-8ab3-4414-855e-1f027e0a72d5"))
ComExampleClass2;
    // interface _Object
    // [ default ] interface IFoo
Run Code Online (Sandbox Code Playgroud)

所有这些都是生成的代码,因此您可以轻松地针对COM库编写C ++代码脚本。您必须选择需要的东西,但希望应该足够了。

亲切的问候,

巴滕·伯格爵士