AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Win32/Win64 API (native code) Delphi API-Funktionsaufruf: InternetGetLastResponseInfo
Thema durchsuchen
Ansicht
Themen-Optionen

API-Funktionsaufruf: InternetGetLastResponseInfo

Ein Thema von Luckie · begonnen am 23. Jun 2002 · letzter Beitrag vom 24. Jun 2002
Antwort Antwort
Seite 1 von 2  1 2      
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#1

API-Funktionsaufruf: InternetGetLastResponseInfo

  Alt 23. Jun 2002, 22:30
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.)
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
OregonGhost

Registriert seit: 8. Jun 2002
Ort: Lübeck
1.216 Beiträge
 
Delphi 3 Professional
 
#2
  Alt 23. Jun 2002, 22: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.
Oregon Ghost
---
Wenn NULL besonders groß ist, ist es fast schon wie ein bisschen eins.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#3
  Alt 23. Jun 2002, 22: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
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#4
  Alt 23. Jun 2002, 22: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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#5
  Alt 23. Jun 2002, 22: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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#6
  Alt 23. Jun 2002, 23: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 und zwar vernünftig!
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#7
  Alt 23. Jun 2002, 23: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.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#8
  Alt 23. Jun 2002, 23: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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.117 Beiträge
 
Delphi 11 Alexandria
 
#9
  Alt 23. Jun 2002, 23:51
Moin Luckie,

dafür musst Du die Wininet mit einbinden.
Tschüss Chris
Die drei Feinde des Programmierers: Sonne, Frischluft und dieses unerträgliche Gebrüll der Vögel.
Der Klügere gibt solange nach bis er der Dumme ist
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#10
  Alt 23. Jun 2002, 23: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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:43 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