AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte nonVCL-FTP-Client
Thema durchsuchen
Ansicht
Themen-Optionen

nonVCL-FTP-Client

Ein Thema von Luckie · begonnen am 21. Jun 2002 · letzter Beitrag vom 3. Jul 2003
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

nonVCL-FTP-Client

  Alt 21. Jun 2002, 09:55
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.
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 .

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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von d3g
d3g

Registriert seit: 21. Jun 2002
602 Beiträge
 
#2
  Alt 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
-- Crucifixion?
-- Yes.
-- Good. Out of the door, line on the left, one cross each.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3
  Alt 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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von d3g
d3g

Registriert seit: 21. Jun 2002
602 Beiträge
 
#4
  Alt 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
-- Crucifixion?
-- Yes.
-- Good. Out of the door, line on the left, one cross each.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#5
  Alt 23. Jun 2002, 10:37
Da stimmt irgendetwas nicht mit FtpGetCurrentDirectory. Es liefert den Fehler ERROR_IO_PENDING = 'Überlappende E/A Operation'
  Mit Zitat antworten Zitat
Benutzerbild von d3g
d3g

Registriert seit: 21. Jun 2002
602 Beiträge
 
#6
  Alt 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
-- Crucifixion?
-- Yes.
-- Good. Out of the door, line on the left, one cross each.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#7
  Alt 23. Jun 2002, 12:38
Baue doch mal dein ProcessMessages vor das FtpGetCurrentDirectory. Denn MessageBox arbeitet auch die Botschaftskette ab.
  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, 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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
jbg

Registriert seit: 12. Jun 2002
3.483 Beiträge
 
Delphi 10.1 Berlin Professional
 
#9
  Alt 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.
  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, 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.

Aber erst mal sollte ich abwaschen. Aber leider keine Spülmaschine, also muß das auch irgendwie "nonVCL" gehen, so zu sagen.
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 22:40 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