API-Funktionsaufruf: InternetGetLastResponseInfo
Code:
Ich bekomme das irgendwie nicht gebacken. So habe ich es probiert:
InternetGetLastResponseInfo Function
-------------------------------------------------------------------------------- Retrieves the last Microsoft® Win32® Internet function error description or server response on the thread calling this function. Syntax BOOL InternetGetLastResponseInfo( LPDWORD lpdwError, LPTSTR lpszBuffer, LPDWORD lpdwBufferLength ); Parameters lpdwError [out] Pointer to an unsigned long integer variable that receives an error message pertaining to the operation that failed. lpszBuffer [out] Pointer to a buffer that receives the error text. lpdwBufferLength [in, out] Pointer to an unsigned long integer variable that contains the size of the lpszBuffer buffer in TCHARs. When the function returns, this parameter contains the size of the string written to the buffer, not including the terminating zero.
Code:
Als Fehlermeldung bekomme ich von Delphi:
var
szBuffer: array[0..255] of Char; dwError: DWORD; begin ... InternetGetLastResponseInfo(dwError, szBuffer, sizeof(szBuffer)); Zitat:
|
Hab's nicht ausprobiert, aber der erste und dritte Parameter sollen LPDWORDs, also Zeiger auf DWORD sein.
sizeof(szBuffer) liefert ein DWORD zurück. Probier's also mal mit
Code:
Ähm... Zumindest in C müsste das so gemacht werden. Wahrscheinlich reicht es, wenn du das für den dritten Parameter so machst. Da der nach dem Funktionsaufruf die Länge des in szBuffer geschriebenen enthalten soll, MUSS also ein Zeiger übergeben werden.
var size: DWORD;
dwError: DWORD; ... size := sizeof(szBuffer); InternetGetLastResponseInfo(@dwError, szBuffer, @size); |
Moin Luckie,
testet:
Code:
Das liegt mal wieder an dieser, vorsichtig formuliert, seltsamen Art, wie Borland die API's manchmal deklariert.
var
dwError : DWord; szBuffer : PChar; dwSize : DWord; begin dwSize := 255; szBuffer := StrAlloc(dwSize); try InternetGetLastResponseInfo(dwError, szBuffer, dwSize); finally StrDispose(szBuffer); end; end; Der dritte Parameter ist als var deklariert. Im Prinzip hat Oregon Ghost durchaus recht. So müsste das eigentlich aussehen, aber die Deklaration stammt ja von Borland :( Ich weiss schon, warum ich mir die API's oft selber deklariere ;-) |
Danke, aber so geht es auch nicht, das hatte ich schon probiert. Das "@" vor dwError mag er nicht, da bringt er mir auch obige Fehlermeldung.
|
Moin tom,
das würde ich nicht so sehen. Gemäss Deklaration handelt es sich um Pointer auf DWORD. DWORD ist fest als 32 Bit ohne Vorzeichen anzusehen. Cardinal hingegen würde von einem 64-Bit Compiler als 64 Bit ohne Vorzeichen angesehen werden, und dass passt dann, auch wenn's wohl funktionieren würde, nicht zur Funktionsdeklaration. ;-) |
Danke Christian so geht es. Nur mit dem PChar hatte ich es noch nicht probiert. Allerdings frage ich mich jetzt, ob die Funktion das macht oder ausgibt, was ich will. Bisher scheinen mir die Fehlermeldungen noch recht unbefriedigend.
Ach so: Jetzt ist das Ding schon soweit, dass man mit arbeiten kann :shock: und zwar vernünftig! |
Moin Luckie,
das mit dem PChar ist einfach die Macht der Gewohnheit ;-) Bei mir würde es so aussehen:
Code:
Da wahrscheinlich eine ganze Menge drumherum fehlt, kommt bei mir immer 0, und kein Text ;-)
type
TcsInternetGetLastResponseInfo = function(lpdwError : PDWORD;lpszBuffer : PChar;lpdwBufferLength : PDWORD) : Boolean; stdcall; var InternetGetLastResponseInfo : TcsInternetGetLastResponseInfo; implementation var hWininetDLL : DWORD; {$R *.DFM} procedure TForm1.Button1Click(Sender: TObject); var dwError : DWord; szBuffer : PChar; dwSize : DWord; begin dwSize := 0; szBuffer := nil; InternetGetLastResponseInfo(@dwError,szBuffer,@dwSize); szBuffer := StrAlloc(dwSize); try if not InternetGetLastResponseInfo(@dwError, szBuffer, @dwSize) then begin ShowMessage(SysErrorMessage(GetLastError)); end else begin ShowMessage(trim(szBuffer)); end; finally StrDispose(szBuffer); end; end; initialization begin hWininetDLL := LoadLibrary('WININET.DLL'); if hWininetDLL <> 0 then begin @InternetGetLastResponseInfo := GetProcAddress(hWininetDLL,'InternetGetLastResponseInfoA'); if @InternetGetLastResponseInfo = nil then begin ShowMessage('InternetGetLastResponseInfo'); end; end; end; finalization begin if hWininetDLL <> 0 then begin FreeLibrary(hWininetDLL); end; end; Den zweimaligen Aufruf mache ich, um die Buffergrösse zu ermitteln. Die Methode funkioniert ja bei vielen Funktionen, und es erspart einem den Test ob der Buffer gereicht hat. |
Ah, jetzt wird es klarer, dann stimmt bei dir der Aufruf in Delphi mit dem Aufruf in C überein. Aber ich wollte eigentlich nicht übertreiben.
Anmerkung: StrAlloc und StrDispose sind in der SysUtils drin deswegen nehme ich GetMem und FreeMem. :mrgreen: |
Moin Luckie,
dafür musst Du die Wininet mit einbinden. :mrgreen: |
Macht nichts. Vergrößert das Programm nur unwesentlich. Probier es mal bei einem VCL-Projekt aus. Und bei den vielen Funktionen die ich brauche, wäre dass dann doch etwas mühseelig.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:24 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz