gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 19:51:34 25 4
gpt4 key购买 nike

我有一个独立的应用程序,它公开 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com