Здравствуйте, Аноним, Вы писали:
А>приветствую!
А>Я перехватываю функцию HttpSendRequestW из WinInet в IE9 , наблюдаю мистическое поведение
А>Код выглядит так:
А>А>var
А> HttpSendRequestWhook: THttpSendRequestW;
А>function HttpSendRequestWHookProc(hRequest: HINTERNET; lpszHeaders: PWideChar;
А> dwHeadersLength: DWORD; lpOptional: Pointer;
А> dwOptionalLength: DWORD): BOOL; stdcall;
А>var
А> wsTmp: WideString;
А>begin
А> OutputDebugStringA('[HttpSendRequestWHookProc]');
А>// wsTmp := '11';
А> Result := HttpSendRequestWhook(hRequest, lpszHeaders, dwHeadersLength, lpOptional, dwOptionalLength);
А>end;
А>begin
А> OutputDebugString('Dll Main');
А> @HttpSendRequestWhook := HookCode(GetProcAddress(LoadLibrary('WinInet.dll'), 'HttpSendRequestW'), @HttpSendRequestWHookProc);
А>end.
А>
А>Если в HttpSendRequestWHookProc делать какие-то действия, например, OutputDebugStringW(lpszHeaders); или еще чего — всё ок. А вот если убрать комментарий с wsTmp := '11' — IE начнёт возвращать Internet Explorer cannot display the webpage!!
А>Я грешил на менеджер памяти, попробовал подключить FastMM — пофигу. Пробовал отлаживать, но проблему найти так и не удалось.
А>Кто постарше, посоветуйте как искать причину или помогите разобраться, пожалуйста..
А>Спасибо!
Если делать действия в HttpSendRequestWHookProc, они могут изменить GetLastError()-значение в TEB.
wsTmp := '11'; приводит у вызову SysFreeString с ненулевым параметром при достижении end, оно делает SetLastError(0);
решение — аккуратно сохранять значение LastError, полученное после вызова оригинальной функции и восстанавливать его перед возвратом. при использовании строк WideString — использовать восстановление LastError после освобождение Wide-строк, т.к. в некоторых случаях именно ненулевой LastError будет тем что нужно.