GlobalFree-不兼容的类型:“ NativeUInt”和“ PWideChar”

时间:2019-11-05 08:49:54

标签: delphi winapi

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并在我的测试中工作正常)吗?

1 个答案:

答案 0 :(得分:8)

当MSDN告诉您释放特定功能时,那么这样做是最好的选择。

Windows API的某些部分是用C语言编写的(某些部分甚至没有定义STRICT?)和其他具有更好类型检查的语言将需要在某些地方进行强制转换。

对于HGLOBAL,您具有GlobalFlags功能可以为您提供帮助。在您的情况下,标志的低字节为零,表示没有锁。如果字符串被分配为可移动字符串,那么文档将必须告诉您在访问内存之前要锁定,而不会。

棺材里的最后一个钉子就是调试该函数,如果这样做,您会看到它调用了标志设置为0x40(GlobalAlloc)的GPTR,因此应该传递给{{ 1}},而无需解锁。如果编译器抱怨,则必须强制转换为适当的类型:

GlobalFree