c# - 如何处理 COM 互操作中的 var(或 ref)参数?

标签 c# delphi com com-interop

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

procedure FindTask(const TaskId: WideString; var Task: OleVariant); safecall;

注:Task也暴露为 CoClass .
注:Task是 [进,出]

到目前为止,我的遗留应用程序(也是用 Delphi 编写的)已经能够与独立应用程序进行通信。将该独立应用程序视为进程外 COM 服务器,并将此旧应用程序视为客户端应用程序。

当我在 C# 中重写旧的 Delphi 应用程序(客户端)时,我必须在 C# 中使用 COM Interop 来与该应用程序进行通信。因此,我使用 tlbimp.exe 将这些 COM 接口(interface)转换为 C# 接口(interface)。

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

最佳答案

在我看来,该参数实际上是一个输出参数。您实际上似乎并没有尝试传递任何东西。该方法似乎正在返回一个不同的对象。所以在 C# 中它应该是:

void FindTask(string TaskId, out object Task);

然后你会这样称呼它:

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

如果它真的是输入/输出,那么您将继续使用 ref并像这样调用方法:
object target = null;
scheduler.FindTask("A GUID value", ref target);
ScTask translated = (ScTask) target;

或者可能传入一个具有有意义状态的实际对象,如果它是这样设计的。

关于c# - 如何处理 COM 互操作中的 var(或 ref)参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31171971/

相关文章:

c# - 如何在 C# 中创建 ActiveX 控件?

c++ - 在 SAFEARRAY 中访问 BSTR

c# - 有什么办法可以使它成为更快的算法吗?

c# - 准备好的 MySQL 语句无法插入且没有错误

c# - 从 SQL Server 数据库中获取字符串值

delphi - 通过Delphi的TIdHTTP访问Clickbank API?

http - Delphi - 使用 Synapse 下载有进度的文件

c# - 具有自定义 IEqualityComparer 的 Distinct() 方法的大 O

windows - 如何追踪句柄泄漏?

c++如何在运行时获取COM对象Coclass的progid