将 BSTR 从 OLE 返回到 Inno Setup
Returning BSTR from OLE to Inno Setup
在我的设置中,使用 Inno Setup 创建5.x我正在使用代码执行 HTTP 请求。
这是由 WinHttpRequest
COM 完成的。
虽然将字符串参数传递给函数相当容易,但我在接收它们时遇到了问题。
例如函数GetResponseHeader
HRESULT GetResponseHeader(
[in] BSTR Header,
[out, retval] BSTR *Value
);
接受一个 IN 参数和一个 OUT 参数。
将空字符串传递给 Value
会导致抛出 Invalid Variant Operation
。
[out, retval] BSTR *Value
在 Pascal 方面的正确类型是什么?如何将其转换为字符串?我应该手动释放它吗?
其实就是把那种方法签名转成函数。实际上,该方法具有以下签名:
function GetResponseHeader(Header: string): string;
所以你可以这样做:
var
WinHttpReq: Variant;
ContentType: string;
begin
WinHttpReq := CreateOleObject('WinHttp.WinHttpRequest.5.1');
WinHttpReq.Open('GET', 'https://www.example.com/', False);
WinHttpReq.Send();
ContentType := WinHttpReq.GetResponseHeader('Content-Type');
Log(ContentType);
end;
在我的设置中,使用 Inno Setup 创建5.x我正在使用代码执行 HTTP 请求。
这是由 WinHttpRequest
COM 完成的。
虽然将字符串参数传递给函数相当容易,但我在接收它们时遇到了问题。
例如函数GetResponseHeader
HRESULT GetResponseHeader(
[in] BSTR Header,
[out, retval] BSTR *Value
);
接受一个 IN 参数和一个 OUT 参数。
将空字符串传递给 Value
会导致抛出 Invalid Variant Operation
。
[out, retval] BSTR *Value
在 Pascal 方面的正确类型是什么?如何将其转换为字符串?我应该手动释放它吗?
其实就是把那种方法签名转成函数。实际上,该方法具有以下签名:
function GetResponseHeader(Header: string): string;
所以你可以这样做:
var
WinHttpReq: Variant;
ContentType: string;
begin
WinHttpReq := CreateOleObject('WinHttp.WinHttpRequest.5.1');
WinHttpReq.Open('GET', 'https://www.example.com/', False);
WinHttpReq.Send();
ContentType := WinHttpReq.GetResponseHeader('Content-Type');
Log(ContentType);
end;