我有一个独立的应用程序,它公开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 *
的方法,因此将其翻译为对象,但实际上有更精确的类型?
答案 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;
或者可能传递具有有意义状态的实际对象,如果它是如何设计工作的。