Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Software-Projekte der Mitglieder (https://www.delphipraxis.net/26-software-projekte-der-mitglieder/)
-   -   nonVCL-FTP-Client (https://www.delphipraxis.net/214-nonvcl-ftp-client.html)

Luckie 21. Jun 2002 09:55


nonVCL-FTP-Client
 
Nein, ich bin nicht wahnsinnig. Das ist nur eine Studie. :!:

Wie gesagt es handelt sich um einen sehr einfachen FTP-Client, realisiert nur mit der Windows-API. Und soll nur eine kleine Studie sein, dass es auch ohne geht

Ich erwarte nicht, dass da jemand ernsthaft mit arbeitet. Wenn es doch jemand schaffen sollte eine, sagen wir, 75 Seiten umfasssende Internetseite mit mehreren Unterverzeichnissen in mehreren Ebenen hochzuladen und zum Laufen zu bringen, dem gebe ich einen aus. :mrgreen:
Kleiner Tipp: Wer damit wirklich was hochladen will, sollte sich auf dem Server auskennen und eventuell eine Verzeichnisstruktur samt Dateien neben sich auf dem Schreibtisch liegen haben :wink:.

Link: nonVCL-FTP-Client

Anmerkung: Das mit ermitteln des aktuellen Verzeichnisses habe ich noch nicht hinbekommen, aber wenn jemand Lust hat, die Sourcen sind, wie immer bei mir, dabei.

d3g 22. Jun 2002 18:53

Hi Luckie,

schöner Client :-)

Ich habe dein Problem mit dem verzeichnis übrigens gelöst: lenDir ist bei dir IMMER 0, weil FtpGetCurrentDirectory immer nur so viele Zeichen kopiert, wie das letzte Flag angibt (und dann den Wert so äbändert, dass die wirklich kopierten Ziechen drinstehen). So musst du also lenDir nicht mit 0, sondern mit MAX_PATH initialisieren:

Code:
procedure GetCurDir(handle: Cardinal);
var
  szBuffer: array[0..255] of Char;
  szDir: PChar;
  lenDir: DWORD;
begin
  lenDir := MAX_PATH;
  FTPGetCurrentDirectory(hFTPSession, nil, lenDir);
  GetMem(szDir, lenDir);
  FTPGetCurrentDirectory(hFTPSession, szDir, lenDir);
  lstrcpy(szBuffer, 'aktuelles Verzeichnis: ');
  lstrcat(szBuffer, szDir);
  SendMessage(GetDlgItem(handle, IDC_LSTMSG), LB_ADDSTRING, 0, Integer(@szBuffer));
  FreeMem(szDir);
end;
MfG,
d3g

Luckie 22. Jun 2002 19:21

Hallo d3g,
danke für deine Mühe, aber hast du den Code mal ausprobiert? Bei mir knallt das ganz gewaltig. Ich bekomme eine Zugriffsverletzung und bekomme das CPU-Fenster zu sehen.

d3g 22. Jun 2002 20:00

Hi Luckie,

latürnich habe ich den Code ausprobiert, allerdings im Step-by-Step-Verfahren (F8-Taste) - da knallts nämlich nicht. Wenn ich das Prog so ausführe, allerdings doch :?:

Das ist ja toll: sobald man debuggen will funzts und wenn nicht, dann knallts...

MfG,
d3g

jbg 23. Jun 2002 10:37

Da stimmt irgendetwas nicht mit FtpGetCurrentDirectory. Es liefert den Fehler ERROR_IO_PENDING = 'Überlappende E/A Operation'

d3g 23. Jun 2002 11:15

Hi Leute,

der Fehler kommt wohl davon, dass FtpGetCurrentDirecory immer MAX_PATH Zeichen zurürckgibt und dass das die Größe von szBuffer überschreitet. Deshalb habe ich den Code so abgeändert:

Code:
procedure GetCurDir(handle: Cardinal);
const
  LEN_CUR_DIR = 23; // Length('aktuelles Verzeichnis: ')
var
  szBuffer: array[0..MAX_PATH - 1 + LEN_CUR_DIR] of Char;
  szDir: PChar;
  lenDir: DWORD;
begin
  lenDir := MAX_PATH;
  GetMem(szDir, lenDir);
  FTPGetCurrentDirectory(hFTPSession, szDir, lenDir);
//  MessageBox(0, szDir, 'GetCurDir', 64);
  lstrcpy(szBuffer, 'aktuelles Verzeichnis: ');
  lstrcat(szBuffer, szDir);
  SendMessage(GetDlgItem(handle, IDC_LSTMSG), LB_ADDSTRING, 0, Integer(@szBuffer));
  FreeMem(szDir);
end;
Jetzt aber ist szDir = ''. Nur wenn man vorher im Debug-Modus sich szDir ansieht, oder die MessageBox oben einbaut, dann erhlält man zwar zuerst szDir='', aber dann einen Befehl später den Verzeichnisort...

MfG,
d3g

jbg 23. Jun 2002 12:38

Baue doch mal dein ProcessMessages vor das FtpGetCurrentDirectory. Denn MessageBox arbeitet auch die Botschaftskette ab.

Luckie 23. Jun 2002 13:03

Hm, muß ich mir noch mal ankucken.
Also wenn ich nur die Messagebox anzeigen lasse, ist die immer leer. Mache ich LB_ADDSTRING kracht es wieder.

Jetzt aber Formel1 Start.

jbg 23. Jun 2002 14:42

Ich glaube ich hab den Fehler. Du übergibst bei InternetOpen das Flag INTERNET_FLAG_ASYNC, was soviel heißt, dass du eine Anforderung schickst, diese aber nicht gleich zurückgeliefert haben willst. Somit kehrt FtpGetCurrentDirectory sofort zurück und hat nichts verändert, merkt sich aber die Speicheradresse, wo das Resultat, der Verzeichnisname, hingeschrieben werden soll. Dein Programm gibt diesen Speicherbereich jedoch wieder frei, wenn FtpGetCurrentDirectory zurückgekehrt ist, und deswegen versucht die WinInet Funktion in einen nicht mehr gültigen Speicherbereich zu schreiben, wenn der Request vom Server beantwortet ist.

Als Lösung kannst du einfach das Flag INTERNET_FLAG_ASYNC beim Aufruf von InternetOpen weg lassen. Dann funktioniert es. Hab es ausprobiert.

Luckie 23. Jun 2002 14:55

Aaaaaah, ihr seit zum knuddeln Jungs. Danke. Vielen Dank.

Jetzt werde ich noch kucken, ob ich ein Verzeichnislisting hin bekomme und dann kann man mit dem teil schon fast arbeiten. :mrgreen:

Aber erst mal sollte ich abwaschen. Aber leider keine Spülmaschine, also muß das auch irgendwie "nonVCL" gehen, so zu sagen. :cry:


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:00 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