Ich habe an den Projekteinstellungen von Deinem Projekt nichts geändert. Demnach habe ich 'synapse_x', also von Dir, eingebunden.
Ich bin heute morgen mal Schritt für Schritt durch das Programm von theo gegangen und merkwürdig, wenn ich wirklich jeden einzelnen Schritt mit dem Debugger durchlaufe, funktioniert es! Kritisch scheint vor allem folgende Funktion in 'ftpsend' zu sein:
Code: Alles auswählen
function TFTPSend.ReadResult: Integer;
var
s, c: string;
begin
FFullResult.Clear;
c := '';
repeat
s := FSock.RecvString(FTimeout);
if c = '' then
if length(s) > 3 then
if s[4] in [' ', '-'] then
c :=Copy(s, 1, 3);
FResultString := s;
FFullResult.Add(s);
DoStatus(True, s);
if FSock.LastError <> 0 then
Break;
until (c <> '') and (Pos(c + ' ', s) = 1);
Result := StrToIntDef(c, 0);
FResultCode := Result;
end;
In der Variablen s wird die Antwort der Servers zurückgegeben, übrigens ausgeschrieben z.B. "erwarte Passwort" oder so ähnlich und irgendwelchen Erfolgsstatusmeldungen, z.B. "220" (Welcome). Wenn ich aber die Kommandos, z.B. "x := FTPCommand('xy');" im Debugger durchlaufen lasse, scheitert der Befehl.
Übrigens auch, wenn ich das Programm ohne Lazarus starte. Also irgendein Timer bzw. Synchronisier-Problem, weil mein Rechner vielleicht zu schnell ist

, kann es auch nicht sein, weil Dein compiliertes Programm ja funktioniert.
Ein weiterer Ansatz scheint mir zu sein, dass auf meinem Rechner vielleicht irgendwelche dll anders sind (Windos Vista). Ich habe mir die Units mal angeschaut. in synsock z.B. gibt es folgende Direktiven
Code: Alles auswählen
...
{$IFDEF WIN32}
{$I sswin32.pas}
{$ELSE}
{$IFDEF FPC}
{$I ssfpc.pas}
{$ELSE}
{$I sslinux.pas}
{$ENDIF}
{$ENDIF}
...
und dann werden in sswin32.inc folgende dll verwendet:
Code: Alles auswählen
...
{$IFDEF WINSOCK1}
DLLStackName = 'wsock32.dll';
{$ELSE}
DLLStackName = 'ws2_32.dll';
{$ENDIF}
DLLwship6 = 'wship6.dll';
...
Also werden bei mir mindestens die dll's 'ws2_32.dll und wship6.dll verwendet. Aber dass es daran liegen könnte, dagegen spricht ja wieder, dass Dein compiliertes Programm bei mir läuft.
Es sei denn - nächste Theorie -, irgendwelche Compiler-Direktiven sind defaultmäßig anders eingestellt. Da ich ja die Flags auf 'WIN64' und 'x86_64' stehen habe, weil ich die Lazarus Windows64 Version vewende und deshalb WIN32 unter "Compilereinstellungen / Andere" als '-dWIN32' eintragen muss (auch bei Deinem Programm, sonst kann ich es nicht compilieren). Damit könnte das Problem irgendwie mit einer unterschiedlichen Steuerung durch die Direktiven zusammenhängen. Aber dagegen spricht wieder, dass es ja im "Schritt für Schritt"-Debugging funktioniert.
Rätsel über Rätsel. Werde über's Wochenende immer mal wieder sporadisch der Sache nachgehen.
Nachtrag: Hier noch meine Compiler-Einstellungen:
Code: Alles auswählen
-MObjFPC -Sgi -O1 -gl -WG -vewnhi -l -Fusynapse_x\ -Fu..\..\..\..\..\..\..\..\lazarus\lcl\units\x86_64-win64\ -Fu..\..\..\..\..\..\..\..\lazarus\lcl\units\x86_64-win64\win32\ -Fu..\..\..\..\..\..\..\..\lazarus\packager\units\x86_64-win64\ -Fu. -oproject1.exe -dWIN32 -dLCL -dLCLwin32