delphi - 如何从 COM 服务器返回 WideString?

标签 delphi com delphi-2006 widestring

该接口(interface)位于_TLB.pas文件

// *********************************************************************//
// Interface: ITMyCOM
// Flags: (256) OleAutomation
// GUID: {D94769D0-F4AF-41E9-9111-4D8BC2F42D69}
// *********************************************************************//
ITMyCOM = interface(IUnknown)
['{D94769D0-F4AF-41E9-9111-4D8BC2F42D69}']
function MyDrawWS(a: Integer; b: Integer): WideString; stdcall;
end;

这着眼于 Windows 操作系统

[
odl,
uuid(D94769D0-F4AF-41E9-9111-4D8BC2F42D69),
version(1.0),
helpstring("Interface for TMyCOM Object"),
oleautomation
]
interface ITMyCOM : IUnknown {
BSTR _stdcall MyDrawWS(
[in] long a, 
[in] long b);
};

COM 服务器中的函数如下所示

function TTMyCOM.MyDrawWS(a, b: Integer): WideString;
begin
Result := WideString(IntToStr(a+b));
end;

在 COM 客户端中,我调用此函数,例如

Edit1.Text := String(MyCOM.MyDrawWS(1,1));

并出现错误第一次机会异常,价格为 $75A9FBAE。异常类 EAccessViolation,带有消息“模块‘RPCRT4.dll’中地址 75A409A4 处的访问冲突”。读取地址 FFFFFFF8'。处理 Project1.exe (2296)

如果我想返回整数,这是可行的。如何返回WideString?

最佳答案

正确的处理方法如下:

[ 
odl, 
uuid(D94769D0-F4AF-41E9-9111-4D8BC2F42D69), 
version(1.0), 
helpstring("Interface for TMyCOM Object"), 
oleautomation 
] 
interface ITMyCOM : IUnknown { 
HRESULT _stdcall MyDrawWS( 
[in] long a,  
[in] long b,
[out, retval] BSTR* ret); 
}; 

ITMyCOM = interface(IUnknown) 
  ['{D94769D0-F4AF-41E9-9111-4D8BC2F42D69}'] 
  function MyDrawWS(a: Integer; b: Integer; out ret: WideString): HResult; stdcall; 
end; 

function TTMyCOM.MyDrawWS(a, b: Integer; out ret: WideString): HRESULT; 
begin 
  ret := IntToStr(a+b);
  Result := S_OK;
end; 

var
  W: WideString;
begin
  OleCheck(MyCOM.MyDrawWS(1, 1, W));
  Edit1.Text := W;
end;

然后可以通过在接口(interface)的 Delphi 声明(而不是 TypeLibrary 本身)中使用 Delphi 的 safecall 调用约定来稍微简化:

ITMyCOM = interface(IUnknown) 
  ['{D94769D0-F4AF-41E9-9111-4D8BC2F42D69}'] 
  function MyDrawWS(a: Integer; b: Integer): WideString; safecall;
end; 

function TTMyCOM.MyDrawWS(a, b: Integer): WideString;
begin 
  Result := IntToStr(a+b);
end; 

Edit1.Text := MyCOM.MyDrawWS(1, 1);

关于delphi - 如何从 COM 服务器返回 WideString?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4183773/

相关文章:

Delphi - 应用程序独立于区域设置

delphi - 无法链接图标资源

multithreading - Delphi Threading/PPL-在TTask.Run或TThread.CreateAnonymousThread中将Timer.Enabled设置为True后,永远不会触发OnTimer事件

C# 函数不更新 SAFEARRAY

c++ - 在 64 位环境中加载 native COM DLL

delphi - 正确的灾难性错误处理

Delphi 空闲处理程序仅在我移动鼠标时触发

delphi - 在某些情况下删除部分条件

delphi - 在存储库 (SVN) 中包含 Delphi 类型库?

c# - 在 .NET 中释放 COM 对象的 "ownership"