gpt4 book ai didi

C#——EasyHook CoCreateInstance

转载 作者:太空宇宙 更新时间:2023-11-03 22:25:23 27 4
gpt4 key购买 nike

我正在使用开源库 EasyHook .

我想做的是,当 VB6 应用程序在特定 CLSID 上从 ole32.dll 调用 CoCreateInstance 时 Hook ,返回我自己的对象 C# 实现而不是真正的 COM 对象。我的 C# 实现派生自 tlbimp.exe 为我要替换的 COM 对象吐出的同一接口(interface)。

我的 Hook 有效,我能够挂接到调用、记录有关调用的数据,然后从 C# p/invoke CoCreateInstance 以允许 VB6 应用程序正常运行。

我注意到我要替换的 COM 对象没有通过我的 Hook 传递。

有谁知道 VB6 是如何加载 ocx 文件的?我是否连接到正确的 native API 调用?

或者由于 .Net 的性质,我试图做的事情是不可能的?

更新:另一种解决方案是编写一个 COM 对象来替换旧的,但我们无法让它工作。这是我关闭的关于该主题的旧帖子:Replace COM object

更新:经过进一步检查,我们能够 regsvr32/u 旧的 ocx 文件并使用 regasm 注册我们的 .Net dll。我们在 COM 对象的构造函数中放置了一个 MessageBox,VB6 应用程序加载并弹出该框,但它在对该对象进行第一个方法调用后立即崩溃。

我怀疑我们有一些方法签名错误,而且我们使用的是 tlbimp.exe 在我们要替换的目标 ocx 上运行时给我们的东西。是否有可能是 tlbimp 正在更改阻止 VB6 应用程序加载程序集的签名?

例如,有时 COM 签名看起来像:

HRESULT MyMethod(IUnknown* ppv);

tlbimp.exe 会给 C# 类似的东西:

IUnknown MyMethod();

对于 C# 开发人员来说,这看起来更简洁。有谁知道这件事,或者有一篇好文章可以解释如何从 C# 编写“二进制兼容”的 COM 程序集来替换 ocx 文件?

最佳答案

一些评论:首先,VB6 不在“本地”类(即来自同一项目的类)上使用 CoCreateInstance——它直接调用“构造函数”。其次,您必须在可以从中共同创建 CLSID 的每个 dll/ocx 的导入部分 Hook CoCreateInstance。

更好的方法是使用相同的 coclass CLSID 注册您“升级”的 COM 组件。这样客户端应用程序就会自动使用它。

编辑:或者看看CoTreatAsClass功能。

关于C#——EasyHook CoCreateInstance,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1608707/

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