![]() |
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: ![]() 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. |
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:
MfG,
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; d3g |
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. |
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 |
Da stimmt irgendetwas nicht mit FtpGetCurrentDirectory. Es liefert den Fehler ERROR_IO_PENDING = 'Überlappende E/A Operation'
|
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:
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...
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; MfG, d3g |
Baue doch mal dein ProcessMessages vor das FtpGetCurrentDirectory. Denn MessageBox arbeitet auch die Botschaftskette ab.
|
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. |
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. |
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 00:26 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz