WinHttpGetIEProxyConfigForCurrentUser的文档说:
调用方必须释放lpszProxy,lpszProxyBypass和 WINHTTP_CURRENT_USER_IE_PROXY_CONFIG中的lpszAutoConfigUrl字符串 如果它们为非NULL,则为结构。使用 GlobalFree 释放字符串。
我编写了以下代码(Delphi 10.3.2):
var
VConfig: TWinHttpCurrentUserIEProxyConfig;
begin
FillChar(VConfig, SizeOf(VConfig), 0);
if not WinHttpGetIEProxyConfigForCurrentUser(VConfig) then begin
RaiseLastOSError;
end;
...
if VConfig.lpszAutoConfigUrl <> nil then begin
GlobalFree(VConfig.lpszAutoConfigUrl); // <-- Error
end;
并出现错误:
[dcc32错误] E2010不兼容的类型:“ NativeUInt”和“ PWideChar”
问题:
我应该将PWideChar
投射到NativeUInt
吗?
我可以使用GlobafFreePtr
代替GlobafFree
(它接受PWideChar
并在我的测试中工作正常)吗?
答案 0 :(得分:8)
当MSDN告诉您释放特定功能时,那么这样做是最好的选择。
Windows API的某些部分是用C语言编写的(某些部分甚至没有定义STRICT
?)和其他具有更好类型检查的语言将需要在某些地方进行强制转换。
对于HGLOBAL,您具有GlobalFlags
功能可以为您提供帮助。在您的情况下,标志的低字节为零,表示没有锁。如果字符串被分配为可移动字符串,那么文档将必须告诉您在访问内存之前要锁定,而不会。
棺材里的最后一个钉子就是调试该函数,如果这样做,您会看到它调用了标志设置为0x40(GlobalAlloc
)的GPTR
,因此应该传递给{{ 1}},而无需解锁。如果编译器抱怨,则必须强制转换为适当的类型:
GlobalFree