如何在COM Interop中处理var(或ref)参数?

时间:2015-07-01 21:25:33

标签: c# delphi com com-interop

我有一个独立的应用程序,它公开COM接口/ CoClasses / Enums等。其中一个接口导出以下功能:

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并使用此签名接收已存在的任务的结果?

我试过这个:(任务是CoClass类型)

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 *的方法,因此将其翻译为对象,但实际上有更精确的类型?

1 个答案:

答案 0 :(得分:2)

它看起来好像参数确实是一个out参数。您实际上似乎没有尝试传递任何内容。该方法似乎返回一个不同的对象。所以在C#中它应该是:

void FindTask(string TaskId, out object Task);

然后你会这样称呼它:

您需要更改类型库以指定语义。

如果它真的进/出然后你继续使用ref并调用这样的方法:

object target = null;
scheduler.FindTask("A GUID value", ref target);
ScTask translated = (ScTask) target;

或者可能传递具有有意义状态的实际对象,如果它是如何设计工作的。