我有一个独立的应用程序,它暴露了COM接口/组件类/枚举,等等。其中一个接口导出以下功能:如何在COM Interop中处理var(或ref)参数?
procedure FindTask(const TaskId: WideString; var Task: OleVariant); safecall;
注:Task
也公开为CoClass
。
注:Task
是[IN,OUT]
到目前为止,我的遗留应用程序,这也是在Delphi编写的,已经能够与独立的应用程序进行通信。将独立应用程序看作是一个超出程序的COM服务器,并将此旧应用程序视为客户端应用程序。
当我在C#中重写旧的Delphi应用程序(客户端)时,我必须在C#中使用COM Interop与该应用程序进行通信。因此,我利用tlbimp.exe将这些COM接口转换为C#接口。
该方法被翻译如下:
void FindTask(string, TaskId, ref object Task);
我怎么能说FindTask和与此签名收到一个已经存在的任务的结果呢?
我试图此:(任务是共类型)
ScTask target = new CsTask();
scheduler.FindTask("A GUID value", ref target);
但是,编译器大喊有关类型,因为不存在与那个类型(经翻译的方法接收的对象)
没有过载我可以这样做吗?
object target = new object();
scheduler.FindTask("A GUID value", ref target);
ScTask translated = (ScTask) target;
我怎样才能调用需要的var
(in, out)
Variant *
的方法,因此翻译为对象,但实际上有一个更精确的类型?
你说得对,大卫。它应该是[out,retval]。我没有设计,这是愚蠢的[进出]。那么,我不能改变,现在...太多的向后兼容性问题,我将使用'target = null'而不是'new object()'; – EProgrammerNotFound