gpt4 book ai didi

c# - 通过 COM 接口(interface)时出错

转载 作者:太空宇宙 更新时间:2023-11-03 16:03:01 24 4
gpt4 key购买 nike

最初,通过后期绑定(bind)创建 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 对象中添加了额外的接口(interface)

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

同时,在其主界面中添加了初始化方法回调

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

然后导入到 VS 项目 DLL - 里面有这个 COMom。从而获得接口(interface)描述。

然后(在 VS 中)创建了一个实现此接口(interface)的类。我尝试通过 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 对象和它自己的 TLB。用 Delphi 7 编写。还有一个用 VS 2010 编写的项目。他使用“Activator Class”创建了 COM。然后通过后期绑定(bind)进行工作。即通过 InvokeMember。

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

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

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

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

完成。

关于c# - 通过 COM 接口(interface)时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20528447/

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