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

2023-12-31

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

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

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

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


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

#include "stdafx.h"

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

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

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

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

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

我的文件里面有一些看起来非常像 idl.txt 的东西。这是一个经过编辑的片段,让您体会一下......

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++ 代码脚本。你必须选择你需要的东西,但希望这应该足够了。

亲切的问候,

巴顿伯格勋爵

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当未提供 COM+ dll 时,从 COM+ dll 获取 IDL(用于 TLB) 的相关文章

随机推荐

  • PHP函数返回NULL而不是数组[重复]

    这个问题在这里已经有答案了 我调用一个执行一些递归并且应该返回一个数组的函数 事实上 被调用函数中 return 语句之前的 var dump 就表明了该数组 然而 调用函数结果的 var dump 显示 NULL 而不是数组 这是调用函数
  • 从 Ruby、PHP 或 Cocoa 访问 Mac 应用程序

    我想通过 Ruby 访问几个不同的 Mac OS X 应用程序 但我会选择 PHP 这些应用程序是Elgato 的turbo 264 和Apple 的iTunes 两者都定义了 Applescript 库 允许我从 Applescript
  • 假冒带有 body 的 get 请求

    由于某种原因 我需要调用 GET 方法 API 并为其传递 json 请求正文 我实在找不到这样的例子 我想知道是否支持使用 feign 我怎样才能使用 feign 做到这一点 是的 Feign 支持它 您可以执行与 POST 请求相同的操
  • 在 10.9 上编译 Swift?

    直到今天下午 当我下载最终版 Xcode 6 时 我才能够在我的 10 9 机器上使用 Swift 现在我得到这个错误 OS X targets using Swift cannot be built against an SDK olde
  • 如何在 WebSphere 中管理 ClassPath

    我的 Websphere v6 1 中的 Web 模块类路径有问题 在我的 WEB INF lib 中 我有大量的 jar 文件 其中包括 xercesImpl jar 和 xmlparserv2 jar 我需要两个罐子都存在 但它们似乎相
  • 在 oracle 12 中搜索逗号分隔值

    我有一张桌子 Product在Oracle中 其中p spc cat id存储为逗号分隔值 p id p name p desc p spc cat id 1 AA AAAA 26 119 27 15 18 2 BB BBBB 0 0 27
  • 如何使用MongoDB聚合进行分页?

    我想执行一个进行基本分页的聚合查询 查找属于某个特定的所有订单company id 订单排序依据order number 统计文档总数 跳至例如文件号码100并传递其余的 将文档数量限制为例如2并将它们传递下去 最后返回计数和文档中选定的几
  • JavaScript Alert() 函数中的单引号转义

    我正在展示一些法语台词javascript alert function法国线看起来像 S il vous pla t accepter les termes et conditions avant de proc der 警报看起来像页面
  • 与 Intel 的 xchgl 等效的 ARM 指令是什么?

    I found LDREX and STREX可能是要使用的 但他们是two指令 因此不提供原子性xchgl 我想要原子交换的值是一个 32 位值 能LDREX and STREX以提供 32 位值的原子交换的方式使用 或者它们是实现它的其
  • 如何在 C 中打印日期?

    我正在尝试从 01 01 01 之类的字符串中打印日期 并得到 2001 年 1 月 1 日星期一 之类的内容 我在 ctime 的 man 中找到了一些东西 但真的不知道如何使用它 有什么帮助吗 Thanks 您可以使用strptime将
  • r 如何保留自定义类的打印方法

    我已经定义了一种使用类测试打印向量的方法 print test lt function x x lt formatC as numeric x format f big mark decimal mark digits 1 x x NA l
  • Angular $http:在“超时”配置上设置承诺

    在角 http docs http docs angularjs org api ng service 24http 它提到您可以将 超时 配置设置为数字或承诺 timeout number Promise 超时 以毫秒为单位 或承诺 解决
  • 如何将自定义结构数组保存到 plist swift

    我正在尝试将警报数据保存到 plist 它采用类alertData 的数组的形式 我能找到的所有信息都指向对其进行编码 然后将其放入数组中 但我很困惑这是做什么的 我也不知道该怎么做 这是我的游乐场 任何帮助都会很棒 类 我正在尝试保存这些
  • 用于 DynamicObject 的 MVC3 ModelBinder

    我正在寻找是否有示例项目 教程 contrib 分支或类似的内容 详细介绍了为 MVC3 实现自定义 ModelBinder 以支持从 DynamicObject 继承的对象 我有一个域对象 它具有由数据库定义的动态数量的属性 并且这些属性
  • 从 C++ 注册预关闭通知的正确方法

    我使用 C 编写本地服务应用程序 但找不到注册预关闭通知的正确方法 适用于 Windows XP 之后的操作系统 我相信从Vista开始就添加了SERVICE CONTROL PRESHUTDOWN通知 但是当您调用SetServiceSt
  • python 打开文本文件,每个字符之间有一个空格

    每当我尝试使用 python 命令打开 csv 文件时fread open input csv r 它总是打开文件 每个字符之间都有空格 我猜文本文件有问题 因为我可以使用相同的命令打开其他文本文件 并且它们已正确加载 有谁知道为什么文本文
  • 通用 Windows (UWP) 范围滑块

    I want to create range slider in UWP I didn t find any example There are only single sliders but I want it like 有人知道我该怎么
  • 什么是密钥库?

    我一直在得到 sun security validator ValidatorException PKIX path building failed sun security provider certpath SunCertPathBui
  • 如何在 Blogger 帖子中嵌入 Google Drive 文档 (PDF)?

    我想将 Google 云端硬盘中的 pdf 文档嵌入到我的 Blogger 帖子中 选择您要嵌入的 pdf 文件 右键单击 gt Preview gt 更多操作 gt 在新窗口中打开 现在点击更多操作 gt 嵌入项目 复制嵌入代码并将其粘贴
  • 当未提供 COM+ dll 时,从 COM+ dll 获取 IDL(用于 TLB)

    我有一个 dll 其中包含一些带有特定 自定义接口进行查询的 directshow 过滤器 COM 大多数第 3 方 directshow 组件包含嵌入式 tlb 文件 可用于跨环境通信 C typelib 导入 我不想尝试手动创建 c 所