Danke für den Tipp. Das sieht dann in meiner Testanwendung so aus und funktioniert tatsächlich:
Delphi-Quellcode:
uses
[...]
DDetours,
Winapi.WinHttp;
[...]
var
TrampolinWinHttpSetOption:
function(hInternet: HINTERNET; dwOption: DWORD;
lpBuffer: Pointer; dwBufferLength: DWORD): BOOL; stdcall=nil;
implementation
function InterceptWinHttpSetOption(hInternet: HINTERNET; dwOption: DWORD; lpBuffer: Pointer; dwBufferLength: DWORD): BOOL;
stdcall;
var
LOption: DWORD;
begin
if dwOption=WINHTTP_OPTION_AUTOLOGON_POLICY
then begin
LOption := WINHTTP_AUTOLOGON_SECURITY_LEVEL_LOW;
Result:=TrampolinWinHttpSetOption(hInternet, WINHTTP_OPTION_AUTOLOGON_POLICY, @LOption, SizeOf(LOption));
end else
Result:=TrampolinWinHttpSetOption(hInternet,dwOption,lpBuffer,dwBufferLength);
end;
{$R *.dfm}
[...]
procedure TmainSoapTest.FormCreate(Sender: TObject);
var
strList: TStringList;
begin
if not Assigned(TrampolinWinHttpSetOption)
then
begin
@TrampolinWinHttpSetOption := InterceptCreate(@WinHttpSetOption, @InterceptWinHttpSetOption);
end;
[...]
end;
In einem echten Programm würde man vielleicht nicht ganz so rabiat vorgehen, sondern aus einer Programmkonfiguration abfragen, ob nicht vielleicht doch mit Benutzernamen/Passwort gearbeitet werden soll. Aber das Prinzip funktioniert.
Jetzt muss ich mal in mich gehen, ob es mir lieber ist, eine zusätzliche externe
Unit einzubinden (also DDetours) oder die ganze HTTClient.Win-
Unit rabiat zu überschreiben. Hm. Ist ja hoffentlich nur bis zum nächsten Delphi-Update... Sinnvollere wäre wahrscheinlich wirklich die Sache mit dem Hook.
Hier noch das Ticket bei QC.