GlobalFree - несовместимые типы: 'NativeUInt' и 'PWideChar' - PullRequest
5 голосов
/ 05 ноября 2019

Документация WinHttpGetIEProxyConfigForCurrentUser говорит:

Вызывающая сторона должна освободить строки lpszProxy, lpszProxyBypass и lpszAutoConfigUrl в структуре WINHTTP_CURRENT_ROYNUSI, если они не являются. Используйте 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 Ответ

8 голосов
/ 05 ноября 2019

Когда MSDN говорит вам освободить определенную функцию, тогда лучше всего делать это.

Части Windows API написаны на C и (некоторые части даже без STRICT определены?) Идругие языки с лучшей проверкой типов в некоторых местах потребуют приведение.

В случае HGLOBAL у вас есть функция GlobalFlags, которая может вам помочь. В вашем случае младший байт флагов равен нулю, что указывает на отсутствие блокировок. Если бы строки были выделены как подвижные, документация должна была бы сказать вам, что нужно заблокировать, прежде чем получить доступ к памяти, и это не так.

Последний гвоздь в гробу - отладка функции, и если вы сделаете это, вы сделаете это. обратите внимание, что он вызывает GlobalAlloc с флагами, установленными в 0x40 (GPTR), и поэтому должен быть передан в GlobalFree без разблокировки. Если ваш компилятор жалуется, вы должны привести к соответствующему типу:

GlobalFree(HGLOBAL(VConfig.lpszAutoConfigUrl)); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...