gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 10:51:35 24 4
gpt4 key购买 nike

该接口(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/

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