【问题标题】:Error when pass COM interface通过 COM 接口时出错
【发布时间】:2013-12-29 23:24:48
【问题描述】:

最初,通过后期绑定创建 COM,然后通过 InvokeMember 调用其方法可能不合适。 但现在,也许,从头开始重做一切已经太晚了。

所以,告诉我该怎么做。

DLL 中有一个 COM 对象。用 Delphi7 编写。

在C#中使用如下:

Type comType = Type.GetTypeFromProgID(ProgID, false);
object comObj = Activator.CreateInstance(comType);
// and then call methods
comType.InvokeMember("DoLongWork", BindingFlags.InvokeMethod, null, comObj, null);

现在我们需要为其添加调用服务器方法的机会(即,将这个 COM 对象保留给自己的人)

为此,在其 TLB 中的一个 COM 对象中添加了额外的接口

IHookCallback = interface(IDispatch)
 procedure ServerHook(DoStuff: integer); safecall;
end;

另外,在它的主界面中增加了初始化方法回调

ITestDisp = dispinterface
...
procedure SetupHook(const Callback: IHookCallback); safecall;

然后导入到 VS 项目 DLL - 里面有这个 COMom。从而获得了对接口描述的访问权限。

然后(在 VS 中)创建了一个实现该接口的类。 我尝试通过 InvokeMember 将其传输到 COM

comType.InvokeMember("SetupHook", BindingFlags.InvokeMethod, null, comObj, new object[] {SomeClass as IHookCallback});

所以也试过了

comType.InvokeMember("SetupHook", BindingFlags.InvokeMethod, null, comObj, new object[] {SomeClass});

我收到一个错误

Exception has been thrown by the target of an invocation.

内部异常

Specified cast is not valid.

我哪里做错了?

【问题讨论】:

  • 我必须承认,我根本无法弄清楚你想要做什么。 COM 通常没那么难。当然,选择后期绑定似乎是受虐狂。
  • 你是对的。一切都变得艰难。我们必须重拍——但没有时间了。更准确地说,我们需要快速修复存在的问题,然后才能做得更好。
  • 好吧,我仍然无法帮助你,因为我仍然无法弄清楚你做了什么以及你在问什么。也许其他人可以。
  • 你好,我会问你一个问题.. 你有一个从 VS C# 调用的服务器中的 COM(1) 运行良好。现在你想添加一个新的 COM(2),它在 TLB 中使用 COM(1) 方法?谢谢

标签: c# delphi com interop marshalling


【解决方案1】:

我做到了。 写在这里可能对我的决定有用。

最初我有一个带有自己 TLB 的 COM 对象。用德尔福 7 编写。 还有一个用VS 2010编写的项目。他使用“Activator Class”创建了COM。然后通过后期装订进行工作。即通过 InvokeMember。

任务是这样的:准备好无法替换的 COM 对象。 IE 是确保向后兼容性和像以前一样使用现有代码所必需的。

但与此同时,您必须编写另一个具有高级功能的 2 COM 对象 - 支持多种新方法。

我解决了这个问题如下:在Delphi 7上创建了一个单独的TLB。它宣布了一个完全独立的接口(继承自IDispatch但没关系)。 然后我创建了一个新的 COM 对象,它实现了旧接口和新接口。

然后修改了C#。他也是通过“Activator Class”来创建对象的,但是在创建后立即将创建的对象带到第二个界面(我在C#项目中导入了第二个TLB的描述),操作符为“as”。如果结果为 NULL,则表明旧 COM 不支持新功能。否则,我们将拥有一个具有增强功能的新 COM。

完成。

【讨论】:

    猜你喜欢
    • 2013-04-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多