Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Win32/Win64 API (native code) (https://www.delphipraxis.net/17-win32-win64-api-native-code/)
-   -   Delphi API-Funktionsaufruf: InternetGetLastResponseInfo (https://www.delphipraxis.net/237-api-funktionsaufruf-internetgetlastresponseinfo.html)

Luckie 23. Jun 2002 21:30


API-Funktionsaufruf: InternetGetLastResponseInfo
 
Code:
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.
Ich bekomme das irgendwie nicht gebacken. So habe ich es probiert:
Code:
var
  szBuffer: array[0..255] of Char;
  dwError: DWORD;
begin
  ...
  InternetGetLastResponseInfo(dwError, szBuffer, sizeof(szBuffer));
Als Fehlermeldung bekomme ich von Delphi:
Zitat:

[Fehler] FTPClient.dpr(207): Die Typen der tatsächlichen und formalen Var-Parameter müssen übereinstimmen
(Der Cursor steht vor dem Semikolon.)

OregonGhost 23. Jun 2002 21:44

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:
var size: DWORD;
     dwError: DWORD;
...
size := sizeof(szBuffer);
InternetGetLastResponseInfo(@dwError, szBuffer, @size);
Ä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.

Christian Seehase 23. Jun 2002 21:50

Moin Luckie,

testet:

Code:
var
  dwError : DWord;
  szBuffer : PChar;
  dwSize  : DWord;

begin
  dwSize  := 255;
  szBuffer := StrAlloc(dwSize);
  try
    InternetGetLastResponseInfo(dwError, szBuffer, dwSize);
  finally
    StrDispose(szBuffer);
  end;
end;
Das liegt mal wieder an dieser, vorsichtig formuliert, seltsamen Art, wie Borland die API's manchmal deklariert.
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 ;-)

Luckie 23. Jun 2002 21:53

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.

Christian Seehase 23. Jun 2002 21:55

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. ;-)

Luckie 23. Jun 2002 22:11

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!

Christian Seehase 23. Jun 2002 22:33

Moin Luckie,

das mit dem PChar ist einfach die Macht der Gewohnheit ;-)

Bei mir würde es so aussehen:

Code:
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;
Da wahrscheinlich eine ganze Menge drumherum fehlt, kommt bei mir immer 0, und kein Text ;-)
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.

Luckie 23. Jun 2002 22:39

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:

Christian Seehase 23. Jun 2002 22:51

Moin Luckie,

dafür musst Du die Wininet mit einbinden. :mrgreen:

Luckie 23. Jun 2002 22:55

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.
Seite 1 von 2  1 2      

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