gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:54:37 25 4
gpt4 key购买 nike

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

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

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

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

最佳答案

是的,可以对 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 结尾的文件,它代表类型库 header 。所以我的路径是

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

在我的文件中有一些看起来很像 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

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

亲切的问候,

巴顿伯格勋爵

关于c++ - 未提供时从 COM+ dll 获取 IDL(用于 TLB),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18385780/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com