【问题标题】:Getting IDL (for TLB) from a COM+ dll when it is not provided未提供时从 COM+ dll 获取 IDL(用于 TLB)
【发布时间】:2013-08-25 11:58:06
【问题描述】:

我有一个 .dll,其中包含一些带有特定/自定义接口的 directshow 过滤器 (COM) 以进行查询。

大多数第 3 方 directshow 组件包含可用于跨环境通信(C# typelib 导入)的嵌入式 .tlb 文件。

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

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

【问题讨论】:

  • 看看tlbexp.exe
  • 这不只适用于 .NET 程序集吗? [ComVisible]
  • 没有。你在拥挤的足球场大喊救命。在某个地方有一个程序员可以为您提供所需的一切。你在这里找到他的可能性很小。拿起电话,给他打电话。如果他不想帮忙,那就到此为止。
  • 我应该使用什么手机?
  • 你是怎么知道接口规格的?你提到你会讨厌手动创建它们,你有关于这些的任何文档吗?

标签: c++ com idl typelib midl


【解决方案1】:

是的,可以对 IDL(或非常接近的东西)进行逆向工程/反汇编。你需要做的是给自己一个新的 C++ 控制台项目,它给出了默认代码

#include "stdafx.h"

int _tmain(int argc, _TCHAR* argv[])
{
    return 0;
}

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

#import "..\ComExample2\bin\Debug\ComExample2.tlb" no_namespace named_guids

然后您构建您的控制台应用程序。如果您深入研究构建期间生成的文件,您会发现一个以 .TLH 结尾的文件,它代表类型库头。所以我的路径是

..\ComExample2\ConsoleApplication1\Debug\comexample2.tlh

在我的文件里面有一个看起来很像 idl 的东西。这是一个经过编辑的 sn-p 给你一个味道....

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

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

亲切的问候,

巴顿伯格勋爵

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-07-15
    • 1970-01-01
    • 2012-11-23
    • 1970-01-01
    • 2023-03-21
    • 2014-10-27
    • 1970-01-01
    • 2011-02-19
    相关资源
    最近更新 更多