-
Будет ли правильным:
function FtpCommand( hConnect: HINTERNET; fExpectResponse: BOOL; dwFlags: DWORD; lpszCommand: PChar; dwContext: DWORD; var phFtpCommand: PHINTERNET): BOOL; stdcall; external 'wininet.dll' name 'FtpCommandA';
procedure TForm1.Button1Click(Sender: TObject); var phFile :PHINTERNET; hFile,hftp:HINTERNET; begin ....... phfile:=@hfile; FtpCommand(hFtp,true,FTP_TRANSFER_TYPE_ASCII, PChar('LIST'),0,phfile); ....... end;
-
> что должна возвращать функция Хэндл или поинтер
Она должна вернуть хэндл, записав его по адресу, переданному последним параметром.
-
То есть если записать так phfile:=@hfile; FtpCommand(hFtp,true,FTP_TRANSFER_TYPE_ASCII, PChar('LIST'),0,phfile); будет верным, т.к FtpCommand(.., @hFile) компилятор ругается на несовпадение типов
-
Что то я понять не могу. FtpCommand(hFtp,true,FTP_TRANSFER_TYPE_ASCII, PChar('LIST'),0,phfile); где phfile:PHinternet. Почему тогда ошибка выпрыгивает. Ведь phfile это адрес где записан хэндл. В чем тогда проблема состоит.
-
> SortoVaritu © (22.06.09 13:42) [63]
что тебе не понятно в [59] ?
-
да можно и так function FtpCommand( hConnect: HINTERNET; fExpectResponse: BOOL; dwFlags: DWORD; lpszCommand: PChar; dwContext: DWORD; phFtpCommand: PHINTERNET): BOOL; stdcall; external 'wininet.dll' name 'FtpCommandA';
-
Я так понимаю в последнем параметре нужно указать адрес моего хэндла hFTP, дабы функция по этому адресу вывела мне сам хэндл.
-
Правильно понимаешь
-
ОК. Баааааааааааааааааааааальшое спасибо за помощь. Премного благодарен. Вечером попробую.
-
Итак. Что получилось.
При таком коде все работает правильно.
s:=PChar('LIST') ; FtpCommand1(hftp,true,FTP_TRANSFER_TYPE_BINARY ,s ,0,phFile); err:=12003; InternetGetLastResponseInfo(err, @Msg, Len); form1.memo1.lines.add(StrPas(@msg));
begin AssignFile(LocalFile, ExtractFilepath(Application.exeName)+sRec .cFileName); {$i-} Rewrite(LocalFile, 1); {$i+}
dwBytesRead := 0; bufsize := READ_BUFFERSIZE;
while (bufsize > 0) do begin Application.ProcessMessages;
if not InternetReadFile(phFile, @buffer, READ_BUFFERSIZE, bufsize) then Break; read if (bufsize > 0) and (bufsize <= READ_BUFFERSIZE) then BlockWrite(LocalFile, buffer, bufsize); dwBytesRead := dwBytesRead + bufsize; CloseFile(LocalFile);
end;
Но если команда не LIST а RETR. То выпрыгивает выше упомянутая ошибка с памятью.
-
> FtpCommand1(hftp,true,FTP_TRANSFER_TYPE_BINARY ,s ,0,phFile);
И вновь нет анализа результата вызова API-функции, см.[12] ! Упрямство, достойное ослиного)
> err:=12003; > InternetGetLastResponseInfo(err, @Msg, Len);
Это что за пляски с бубном ?
Что еще за "err:=12003" ? С какой луны свалилось число 12003 ?
Код ответа сервера следует получать (а не самому устанавливать от балды взятое значение !) лишь после успешного выполнения API-ф-ции, обращающейся к серверу.
И опять же - где анализ результата вызова InternetGetLastResponseInfo ? И если вызов InternetGetLastResponseInfo успешен, где анализ значения, возвращенного этой ф-цией в переменную err ?
Когда ты наконец начнешь читать документацию, прежде чем что-то писать ?)
-
12003 значение взятое не от балды. Да и причем тут это. Для того чтобы получить результат вызова InternetGetLastResponseInfo нужно чтобы FtpCommand1(hftp,true,FTP_TRANSFER_TYPE_BINARY ,s ,0,phFile) выполнился. А он выполняется только с командой LIST. А с коммандой RETR нет. Что анализировать если команда не выполняется?
-
>И если вызов InternetGetLastResponseInfo успешен, где анализ значения, возвращенного этой ф-цией в переменную err ?
Как он может быть успешен если прога даж не доходит до выполнения InternetGetLastResponseInfo
-
> А он выполняется
А где в твоем коде видно что выполняется или не выполняется ? Почему я должен верить тебе на слово ?)
> 12003 значение взятое не от балды
А откуда ?)
> Да и причем тут это
А нашиша тогда ты демонстрируешь этот бестолковый код, не имеющий к проблеме отношения ? И, наоборот, упрямо не приводишь код, имеющий непосредственное отношение к выяснению проблемы (анализ результатов вызовов API-функций и соотв.ветвления последующего алгоритма) ?
> выше упомянутая ошибка с памятью
Опять адрес забыл ?)
-
> Как он может быть успешен если прога даж не доходит до выполнения > InternetGetLastResponseInfo >
Вот как будет доходить, так и будем рассматривать работу InternetGetLastResponseInfo.
А пока это абсолютно бессмысленный код.
-
Так он не бессмысленный. Он работает если команду выполнять LIST. Он мне в файл записывает содержимого каталога. РАБОТАЕТ. НЕ РАБОТАЕТ при выполнении команды RETR. В чем же он тогда бессмысленный.
-
Так он не бессмысленный. Он работает если команду выполнять LIST. Он мне в файл записывает содержимого каталога. РАБОТАЕТ. НЕ РАБОТАЕТ при выполнении команды RETR. В чем же он тогда бессмысленный.
-
> он не бессмысленный. Он работает если команду выполнять > LIST
Он бессмысленный при любой команде ! Ф-ция InternetGetLastResponseInfo не получает, а возвращает код ответа сервера ! За ккаким же лешим ты пишешь какое-то число в переменную err, если следом же вызываешь InternetGetLastResponseInfo, задача которой - изменить значение этой переменной в случае успешного выполнения ф-ции ?
-
Изучай: function FtpCommand(
hConnect: HINTERNET;
fExpectResponse: BOOL;
dwFlags: DWORD;
lpszCommand: PChar;
dwContext: DWORD;
var hFtpCommand: HINTERNET): BOOL;
stdcall; external 'wininet.dll' name 'FtpCommandA';
const
url = 'ftp://ftp.freepascal.org/fpc/contrib/cross/linux/';
procedure TForm1.Button5Click(Sender: TObject);
var
hInet, hFTPSession, hFile: HINTERNET;
RCode, RTLen: Cardinal;
RText: String;
begin
hInet := InternetOpen('FTP', INTERNET_OPEN_TYPE_PROXY, '192.168.7.254:3128', nil, 0);
Win32Check(Assigned(hInet));
try
hFTPSession := InternetConnect(hInet, 'ftp.freepascal.org', 21, nil, nil, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
Win32Check(Assigned(hFTPSession));
try
Win32Check(FtpCommand(hFTPSession, True, FTP_TRANSFER_TYPE_BINARY, 'RETR /fpc/contrib/cross/linux/binutils-fpc-netware.spec', 0, hFile));
try
RTLen := 255;
SetLength(RText, RTLen);
RCode := 12003; Win32Check(InternetGetLastResponseInfo(RCode, PChar(RText), RTLen));
SetLength(RText, RTLen);
ShowMessage('Response code = ' + IntToStr(RCode) + #10#10'Response text is'#10#10 + RText)
finally
InternetCloseHandle(hFile);
end;
finally
InternetCloseHandle(hFTPSession);
end;
finally
InternetCloseHandle(hInet);
end;
end;
-
За совет, спасибо. Это все я понимаю. То что лишний код оставил, так это у меня всегда такой мусор валяецца. Признаю. Только ведь InternetGetLastResponseInfo не выполняется даже. Софтина останавливается на ошибке памяти.
|