首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从COM服务器返回WideString?

如何从COM服务器返回WideString?
EN

Stack Overflow用户
提问于 2010-11-15 11:17:08
回答 5查看 2.5K关注 0票数 3

_TLB.pas文件中的这个接口

代码语言:javascript
复制
// *********************************************************************//
// 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的

代码语言:javascript
复制
[
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服务器中显示为

代码语言:javascript
复制
function TTMyCOM.MyDrawWS(a, b: Integer): WideString;
begin
Result := WideString(IntToStr(a+b));
end;

在COM客户端中,我调用这个函数就像

代码语言:javascript
复制
Edit1.Text := String(MyCOM.MyDrawWS(1,1));

并在$75A9FBAE获得错误第一次机会异常。异常类EAccessViolation,在模块'RPCRT4.dll‘中具有消息’地址75A409A4的访问冲突‘。读地址FFFFFF8‘。Process Project1.exe (2296)

如果我想要回Integer,它是可行的。如何返回WideString?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-11-18 03:09:10

正确的处理方法如下:

代码语言:javascript
复制
[ 
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;

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

代码语言:javascript
复制
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);
票数 2
EN

Stack Overflow用户

发布于 2010-11-15 13:04:39

让Delphi自动执行转换。别投了。您可以将(Ansi)字符串转换为PChar,因为它们的内存布局是兼容的,但不能将字符串转换为宽字符串,反之亦然。当你将其中一个分配给另一个时,德尔菲将从转换中获益。

特尔斐< 2009

代码语言:javascript
复制
var
S: string;
W: WideString;
...
S := W;  // Conversion, WideString -> AnsiString;
W := S; // Conversion, AnsiString -> WideString
票数 2
EN

Stack Overflow用户

发布于 2010-11-15 12:53:44

不要使用HRESULT以外的返回值。相反,将返回值作为输出参数放在参数列表中。

代码语言:javascript
复制
function MyDrawWS(a: Integer; b: Integer; out str : WideString): HRESULT; stdcall;

通过这种方式,您还必须使用COM内存管理器IMalloc (CoTaskMemAlloc用于pur COM,SysAllocString用于自动化)。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4183773

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档