- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在使用开源库 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/
以下是简短的重现样本: DWORD WINAPI _threadTest (LPVOID) { Sleep (2000); CoInitialize(0); CoCreateI
我是 .NET 程序员和 COM 新手。想简单了解一下 CoCreateInstance 的作用是什么? 最佳答案 你可以想到CoCreateInstance()作为匿名工厂类的接口(interfac
我有一个调用 CoCreateInstance 的函数。此函数被多次调用并且有效,但是有一次 CoCreateInstance 因“变量类型错误”错误而失败。问题是参数在成功和失败时始终相同。什么会导
我尝试用 direct2d 制作位图。问题是 CoCreateInstance(...) 函数不起作用 HRESULT Renderer::InitImagingFactory() { if
我正在使用开源库 EasyHook . 我想做的是,当 VB6 应用程序在特定 CLSID 上从 ole32.dll 调用 CoCreateInstance 时 Hook ,返回我自己的对象 C# 实
我有一个 DLL,我需要在其中调用 CoCreateInstance()。在 Dllmain() 中,我创建了一个新线程来运行我的函数 do_stuff()。 CoCreateInstance() 在
我有一个 Windows 服务,它在初始化期间调用多个 COM+。在某些系统上,此 Windows 服务会在启动期间导致死锁。 At least one service or driver faile
使用 COM 你使用 CoCreateInstance创建一个对象。 有没有办法完全破坏它,以便单元测试的下一部分可以重新开始? 最佳答案 每个持有引用的 COM 接口(interface)指针的人都
我正在尝试使用 Windows 核心音频 API 从麦克风捕获音频 相关的代码行是 const CLSID CLSID_MMDeviceEnumerator = __uuidof(MMDeviceEn
我正在将一段代码从 C++ 转换为 C#,但不确定如何使用 CoCreateInstance()。这是 C++(这有效并且是我在 C# 中想要的): IComDevice *Device=NULL;
我在这里尝试做的只是创建一个接口(interface)的实例。真的应该这么简单。一直在关注任何在线资料,阅读我能找到但终生无法解决这个问题的资料。 它归结为从 CoCreateInstance 返回的
我有一个关于 CoCreateInstnace() 方法如何定位和创建包含在 COM DLL 中的 CoClass 实例的问题。 根据MSDN : The CoCreateInstance funct
我使用C++ MFC activex脚本调用javascript函数,它编译正常但使用 init 函数运行到 CoCreateInstance,导致读取访问冲突(此 0x4)。如何解决这个问题? 下面
我正在使用 COM 通过 C++ 非托管代码初始化 C# .NET 类,并且即使在非常基本的程序中我也检测到内存泄漏: int _tmain(int argc, _TCHAR* argv[]) {
这是创建 COM 对象的代码示例: CComPtr pFilter; auto hr = CoCreateInstance(CLSID_DMOWrapperFilter, NULL, CLSC
鉴于一些现有代码调用 CoCreateInstance 来创建已注册 COM 对象的实例,是否有一种方法可以重定向这些调用以创建不同的实例? 想法是在同一个进程中(出于测试目的),在不改变原始代码或影
我想使用 DSound Audio Render在我的一个应用程序中,所以我用 CoCreateInstance 加载它.根据my previous question ,如果我没有安装音频硬件,CoC
当我调用 dll 中的 CoCreateInstance() 时,出现错误“不支持此类接口(interface)”。我正在尝试创建 IGroupPolicyObject 的实例。当我通过 exe 运行
我已经成功编译并注册了一个直接显示过滤器。现在我想在我的代码中使用它。但是对 COCreateInstance 的调用返回错误代码 E_NOINTERFACE。 这是我的过滤器的注册码 #inclu
以上是否可行? 我可以这样做吗: IUnknown *punk; punk->QueryInterface(IID_MyInterface, (void**)&m_pMyInterface); 我认为
我是一名优秀的程序员,十分优秀!