C# - 挂钩到现有的COM对象

时间:2009-10-13 21:38:19

标签: c# .net com interop hook

假设我们有一个现有的进程(或应用程序)从ocx文件调用COM对象,例如“MyCOMLibrary.ocx”。

有没有办法编写C#库来完全复制ocx文件?这样原始应用程序可以调用您的C#代码而不是原始的COM对象吗?

当然,您必须使用相同的CLSID和ProgID作为原始ocx。并假设没有涉及签名,例如.Net世界中的SNK。

此外,是否有任何工具可以实现自动化?接受ocx的东西并使用要实现的方法吐出C#文件。

编辑:我想补充说原始应用程序是VB6,根本不使用.Net。他们最有可能将ocx加载为VB6 app(ProgId或Guid)。这会导致任何问题吗?

我们也没有完全重写ocx的问题 - 我们很可能只返回所有方法的成功错误代码,并且只使用我们的情况所需的方法/事件。

编辑:你会认为这不会太难实现。我们可以创建一个可以替换旧ocx的VB6 ocx文件,并将所有调用传递给.Net程序集吗?

编辑:我尝试使用以下开源库:EasyHook

但似乎这个问题应该仍然可行。 VB6似乎以防止挂钩的方式加载COM对象。我没有看到使用EasyHook在类/接口或类的构造函数上挂钩实例方法的方法。

4 个答案:

答案 0 :(得分:3)

您可以使用ActiveX Import AxImp导入OCX,创建包装类然后调用它。该程序在此处描述:http://msdn.microsoft.com/en-us/library/8ccdh774(VS.80).aspx 基本上,您需要做的是在命令提示符上执行以下命令:

c:/>AxImp MyControl.ocx

结果是MyControl.dll和AxMyControl.dll。第一个可以用作项目中的普通.NET DLL(即,没有图形用户界面),第二个可以像在TextBox之类的任何其他控件一样在表单上绘制或Label

要使用它,请转到Visual Studio,右键单击您的项目并选择Add Reference。浏览到新创建的DLL并添加它。就是这样。

答案 1 :(得分:2)

我们的Deviare Hook库可用于挂钩COM对象。您可以在我们的博客中看到与此主题相关的文章:Hooking Outlook COM objects with Deviare

答案 2 :(得分:1)

显然是VBMigration合作伙伴can automatically upgrade a VB6 COM component to a VB.Net component that has binary compatibility with the original VB6 component。我不知道它是否支持OCX。如果确实如此,我建议先使用它,然后再尝试转到C#(如有必要)。

答案 3 :(得分:0)

这个问题并不是一个完整的答案,但我认为可能有用。如果在要替换的对象的CLSID下添加名为“TreatAs”的键,并将默认值设置为要创建的对象的CLSID,则会指示COM运行时创建对象而不是原始对象。然后无需强制您的新替换对象具有与旧对象相同的CLSID和ProgID。

例如,如果您的原始对象具有ProgID“MyComLibrary.Object”和CLSID“{ABC}”,并且您的新对象具有ProgID“MyDotNet.Object”和CLSID“{123}”,则在HKLM / CLSID /下{ABC}添加名为TreatAs的密钥,默认值为{123}。然后,对“MyComLibrary.Object”或“MyDotNet.Object”的任何请求都将获得新对象的副本(假设它们实现相同的接口)。