AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Probleme mit API-Funktiosaufruf

Ein Thema von Luckie · begonnen am 20. Jun 2002 · letzter Beitrag vom 20. Jun 2002
Antwort Antwort
Benutzerbild von Luckie
Luckie

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

Probleme mit API-Funktiosaufruf

  Alt 20. Jun 2002, 10:13
Hi.
ich programmiere gerade einen einfachen FTP-Client ohne VCL
Nicht, dass ich ihn ersthaft nutzen will, es ist eigentlich nur eine Studie.

Nun habe ich aber mit folgender API-Funktion Probleme:
Code:
FTPGetCurrentDirectory()
Aus dem PSDK:
Zitat:
Retrieves the current directory for the specified FTP session.

Syntax

Code:
BOOL FtpGetCurrentDirectory(          HINTERNET hConnect,
    LPTSTR lpszCurrentDirectory,
    LPDWORD lpdwCurrentDirectory
);
Parameters

hConnect
[in] Valid handle to an FTP session.

lpszCurrentDirectory
[out] Pointer to a buffer that receives the current directory string, which specifies the absolute path to the current directory. The string is null-terminated.

lpdwCurrentDirectory
[in, out] Pointer to a variable that specifies the length, in characters, of the buffer for the current directory string. The buffer length must include room for a terminating NULL character. Using a length of MAX_PATH is sufficient for all paths. When the function returns, the variable receives the number of characters copied into the buffer.
Aufrufen tue ich sie wie folgt:
Code:
var
  szCurDir: array[0..255] of Char;
  lenDir: DWORD;
begin
  ...
  FTPGetCurrentDirectory(hFTPSession, szCurDir, lenDir);
Nur ist bei mir szCurDir immer leer und lenDir immer 0.

Wie rufe ich die Funktion also richtig auf? Denn irgendwas mache ich da falsch.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von sakura
sakura

Registriert seit: 10. Jun 2002
Ort: München
11.412 Beiträge
 
Delphi 11 Alexandria
 
#2
  Alt 20. Jun 2002, 10:23
Hi Luckie,

wenn die Funktion so wie die anderen Windows API Funktionen funktioniert, dann gibt es zwei Aufrufkombinationen.

Übergebe nil für den Buffer, um die benötigte Größe in lenDir zurückzuerhalten.
Code:
FTPGetCurrentDirectory(hFTPSession, nil, lenDir);
... Platz in szCurDir mit Hilfe von GetMem reservieren ...

und Funktion erneut aufrufen. In der Variable lenDir muss der Wert enthalten sein, der angibt, wieviel Speicher Du in szCurDir zur Verfügung gestellt hast.

Code:
FTPGetCurrentDirectory(hFTPSession, szCurDir, lenDir);
Ich hoffe, das hilft weiter...

P.S. In Deinem Fall geht auch
Code:
lenDir := SizeOf(szCurDir);
FTPGetCurrentDirectory(hFTPSession, szCurDir, lenDir);
Daniel W.
Ich bin nicht zurück, ich tue nur so
  Mit Zitat antworten Zitat
Christian Seehase
(Co-Admin)

Registriert seit: 29. Mai 2002
Ort: Hamburg
11.105 Beiträge
 
Delphi 11 Alexandria
 
#3
  Alt 20. Jun 2002, 10:23
Moin Luckie,

hast Du auch daran gedacht Dir mit InternetOpen gefolgt von InternetConnect ein Handle zu besorgen?
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 toms
toms
(CodeLib-Manager)

Registriert seit: 10. Jun 2002
4.648 Beiträge
 
Delphi XE Professional
 
#4
  Alt 20. Jun 2002, 10:32
Hi,

Kannst ja mal meinen VCL-Code als Vorlage nehmen zum Schauen, wie
es ungefähr funktioniert. Wichtig ist, dass du jeweils die Handles mit
InternetCloseHandle() schliesst, falls eine Funktion nicht erfolgreich ausgeführt wird.

tom


Code:
uses
  WinInet, ComCtrls;

function FtpDownloadFile(strHost, strUser, strPwd: string;
  Port: Integer; ftpDir, ftpFile, TargetFile: string; ProgressBar: TProgressBar): Boolean;

  function FmtFileSize(Size: Integer): string;
  begin
    if Size >= $F4240 then
      Result := Format('%.2f', [Size / $F4240]) + ' Mb'
    else
    if Size < 1000 then
      Result := IntToStr(Size) + ' bytes'
    else
      Result := Format('%.2f', [Size / 1000]) + ' Kb';
  end;

const
  READ_BUFFERSIZE = 4096; // or 256, 512, ...
var
  hNet, hFTP, hFile: HINTERNET;
  buffer: array[0..READ_BUFFERSIZE - 1] of Char;
  bufsize, dwBytesRead, fileSize: DWORD;
  sRec: TWin32FindData;
  strStatus: string;
  LocalFile: file;
  bSuccess: Boolean;
begin
  Result := False;

  { Open an internet session }
  hNet := InternetOpen('Program_Name', // Agent
                        INTERNET_OPEN_TYPE_PRECONFIG, // AccessType
                        nil, // ProxyName
                        nil, // ProxyBypass
                        0); // or INTERNET_FLAG_ASYNC / INTERNET_FLAG_OFFLINE

  {
    Agent contains the name of the application or
    entity calling the Internet functions
  }


  { See if connection handle is valid }
  if hNet = nil then
  begin
    ShowMessage('Unable to get access to WinInet.Dll');
    Exit;
  end;

  { Connect to the FTP Server }
  hFTP := InternetConnect(hNet, // Handle from InternetOpen
                          PChar(strHost), // FTP server
                          port, // (INTERNET_DEFAULT_FTP_PORT),
                          PChar(StrUser), // username
                          PChar(strPwd), // password
                          INTERNET_SERVICE_FTP, // FTP, HTTP, or Gopher?
                          0, // flag: 0 or INTERNET_FLAG_PASSIVE
                          0);// User defined number for callback

  if hFTP = nil then
  begin
    InternetCloseHandle(hNet);
    ShowMessage(Format('Host "%s" is not available',[strHost]));
    Exit;
  end;

  { Change directory }
  bSuccess := FtpSetCurrentDirectory(hFTP, PChar(ftpDir));

  if not bSuccess then
  begin
    InternetCloseHandle(hFTP);
    InternetCloseHandle(hNet);
    ShowMessage(Format('Cannot set directory to %s.',[ftpDir]));
    Exit;
  end;

  { Read size of file }
  if FtpFindFirstFile(hFTP, PChar(ftpFile), sRec, 0, 0) <> nil then
  begin
    fileSize := sRec.nFileSizeLow;
    // fileLastWritetime := sRec.lastWriteTime
  end else
  begin
    InternetCloseHandle(hFTP);
    InternetCloseHandle(hNet);
    ShowMessage(Format('Cannot find file ',[ftpFile]));
    Exit;
  end;

  { Open the file }
  hFile := FtpOpenFile(hFTP, // Handle to the ftp session
                       PChar(ftpFile), // filename
                       GENERIC_READ, // dwAccess
                       FTP_TRANSFER_TYPE_BINARY, // dwFlags
                       0); // This is the context used for callbacks.

  if hFile = nil then
  begin
    InternetCloseHandle(hFTP);
    InternetCloseHandle(hNet);
    Exit;
  end;

  { Create a new local file }
  AssignFile(LocalFile, TargetFile);
  {$i-}
  Rewrite(LocalFile, 1);
  {$i+}

  if IOResult <> 0 then
  begin
    InternetCloseHandle(hFile);
    InternetCloseHandle(hFTP);
    InternetCloseHandle(hNet);
    Exit;
  end;

  dwBytesRead := 0;
  bufsize := READ_BUFFERSIZE;

  while (bufsize > 0) do
  begin
    Application.ProcessMessages;

    if not InternetReadFile(hFile,
                            @buffer, // address of a buffer that receives the data
                            READ_BUFFERSIZE, // number of bytes to read from the file
                            bufsize) then Break; // receives the actual number of bytes read

    if (bufsize > 0) and (bufsize <= READ_BUFFERSIZE) then
      BlockWrite(LocalFile, buffer, bufsize);
    dwBytesRead := dwBytesRead + bufsize;

    { Show Progress }
    ProgressBar.Position := Round(dwBytesRead * 100 / fileSize);
    Form1.Label1.Caption := Format('%s of %s / %d %%',[FmtFileSize(dwBytesRead),FmtFileSize(fileSize) ,ProgressBar.Position]);
  end;

  CloseFile(LocalFile);

  InternetCloseHandle(hFile);
  InternetCloseHandle(hFTP);
  InternetCloseHandle(hNet);
  Result := True;
end;
Thomas
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5
  Alt 20. Jun 2002, 10:37
@Christian:
Ja das habe ich. Es ist mir ja auch schon gelungen eine Datei hochzuladen. Nur wollte ich das Verzeichnis überprüpfen.

Die Fehlermeldung lautet übrigens (habe ich gerade herausgefunden):
Zitat:
Überlappender E/A-Vorgang wird verarbeitet.
Wenn ich das ganmze auf einen ButtonClick lege bekomme ich folgende Meldung:
Zitat:
Falscher Parameter
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 13:29 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