将字符串传入/传出 Delphi COM 服务器

Passing strings in / out of Delphi COM Server

我已经使用 returning HRESULT(这是首选的 COM 标准)或 returning BSTR 尝试了以下代码的几种变体。我也尝试过其他数据类型。我通常会遇到 "missing implementation of interface method" 编译错误,但是当我使用 return 类型的 WideString 时,result:=RetVal; 指令会出现运行时 AccessViolationException。

我在客户端使用 C#:

var msg = delphi.GetMessage("My Message");

这是我的 RIDL:

HRESULT _stdcall GetMessage([in] BSTR msg, [out, retval] BSTR* RetVal);

这是我的实现:

function TDelphiCom.GetMessage(msg:WideString; out RetVal:WideString):HRESULT;
var
  tempString: string;
begin
  tempString:=msg;
  RetVal:=WideString(tempString);
end;

传递 Delphi COM 服务器的字符串 in/out 的正确方法是什么?

您的 RIDL 声明是正确的。

您没有显示该方法的 C# 声明,因此我们看不到您是否正确封送参数。

在 Delphi 方面,您的实现缺少 stdcall 调用约定(以匹配 RIDL 声明)以及异常处理,因此您可以 return 适当的 HRESULT 失败:

function TDelphiCom.GetMessage(msg: WideString; out RetVal: WideString): HRESULT; stdcall;
var
  tempString: string;
begin
  try
    tempString := string(msg);
    RetVal := WideString(tempString);
    Result := S_OK;
  except
    // do something...
    Result := DISP_E_EXCEPTION;
  end;
end;

不过,您确实应该改用 safecall calling convention 并让它为您处理错误:

function TDelphiCom.GetMessage(msg: WideString): WideString; safecall;
var
  tempString: string;
begin
  tempString := string(msg);
  Result := WideString(tempString);
end;