将字符串传入/传出 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;
我已经使用 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;