2015-07-01 51 views
1

我有一个独立的应用程序,它暴露了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 *的方法,因此翻译为对象,但实际上有一个更精确的类型?

回答

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; 

或者可能通过与有意义的状态的实际对象,如果这是它是如何设计上班。

+0

你说得对,大卫。它应该是[out,retval]。我没有设计,这是愚蠢的[进出]。那么,我不能改变,现在...太多的向后兼容性问题,我将使用'target = null'而不是'new object()'; – EProgrammerNotFound