【发布时间】: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