【发布时间】:2019-11-05 08:49:54
【问题描述】:
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并且在我的测试中工作正常)?
【问题讨论】:
-
GlobalFreePtr调用GlobalHandle从指针获取HGLOBAL,然后调用GlobalUnlock解锁该句柄,然后调用GlobalFree。我在网上看到的所有例子都直接在指针上调用GlobalFree。我的猜测是,至少现在,GlobalHandle直接返回其输入值,换句话说,HGLOBAL与指针相同。我的建议是您直接调用GlobalFree,然后将指针转换为HGLOBAL。GlobalFree(HGLOBAL(...)) -
@DavidHeffernan 我发现this:使用GMEM_FIXED 分配的内存对象的锁计数始终为零。对于这些对象,返回指针的值等于指定句柄的值。 即在某些情况下强制转换指针是不安全的,但应该使用
GlobalFreePtr。所以,我认为在所有情况下使用GlobalFreePtr会更安全。 -
@Anders 的出色回答告诉你你错了,并证明了原因