Форум: "Сети";
Текущий архив: 2011.11.20;
Скачать: [xml.tar.bz2];
ВнизВопрос по FtpGetFile Найти похожие ветки
← →
SortoVaritu © (2009-06-22 11:24) [40]И что сие может озночать
← →
brother © (2009-06-22 11:38) [41]много чего...
← →
SortoVaritu © (2009-06-22 11:50) [42]И как быть
← →
Сергей М. © (2009-06-22 11:53) [43]
> как быть
Адрес запоминать)
И внимательно изучать прототип ф-ции.
← →
SortoVaritu © (2009-06-22 11:58) [44]а что не так с прототипом функции?
← →
Сергей М. © (2009-06-22 11:59) [45]А я откуда знаю, что у тебя там с ним не так ?
Мне отсюда не видать)
← →
brother © (2009-06-22 12:13) [46]ну стандартно: ошибка в 17 строке
← →
SortoVaritu © (2009-06-22 12:14) [47]FtpCommand(hFtp,true,FTP_TRANSFER_TYPE_BINARY,
PChar("RETR "+MyFile),0,hFile)
Функция вызывается вызывается следующим образом
function FtpCommand(
hConnect: HINTERNET;
fExpectResponse: BOOL;
dwFlags: DWORD;
lpszCommand: PChar;
dwContext: DWORD;
var phFtpCommand: PHINTERNET): BOOL;
stdcall; external "wininet.dll" name "FtpCommandA";
Вроде бы как все сделано верно.
← →
brother © (2009-06-22 12:17) [48]> FtpCommand(hFtp,true,FTP_TRANSFER_TYPE_BINARY,
> PChar("RETR "+MyFile),0,hFile)
> Функция вызывается вызывается следующим образом
>
> function FtpCommand(
> hConnect: HINTERNET;
> fExpectResponse: BOOL;
> dwFlags: DWORD;
> lpszCommand: PChar;
> dwContext: DWORD;
> var phFtpCommand: PHINTERNET): BOOL;
> stdcall; external "wininet.dll" name "FtpCommandA";
О_о ?
← →
SortoVaritu © (2009-06-22 12:18) [49]Поясните еще hFTP:HINTERNET а hFile:PHINTERNET. В чем разница?
← →
brother © (2009-06-22 12:20) [50]вообще, я думал это хэндлы, но
> hFTP:HINTERNET а hFile:PHINTERNET. В чем разница?
хэндл и поинтер?
← →
Сергей М. © (2009-06-22 12:30) [51]
> SortoVaritu © (22.06.09 12:14) [47]
Судя по этому прототипу у тебя и "LIST" не должна работать)
← →
SortoVaritu © (2009-06-22 12:41) [52]FtpCommand(hFtp,true,FTP_TRANSFER_TYPE_BINARY,
PChar("RETR "+MyFile),0,hFile). Хорошо hFile Это поинтер. А как тогда создать хэндл?
← →
Сергей М. © (2009-06-22 12:46) [53]А как объявлен PHINTERNET ?
← →
SortoVaritu © (2009-06-22 12:50) [54]PHINTERNET=^HINTERNET
← →
SortoVaritu © (2009-06-22 12:53) [55]может быть
phFile:=@hFile;
FtpCommand(hFtp,true,FTP_TRANSFER_TYPE_BINARY,
PChar("RETR "+MyFile),0,phFile)
← →
Сергей М. © (2009-06-22 12:55) [56]Ясно.
Выкинь в топку свой прототип - его формировал кто-то без головы на плечах.
function FtpCommand(
hConnect: HINTERNET;
fExpectResponse: BOOL;
dwFlags: DWORD;
lpszCommand: PChar;
dwContext: DWORD;
var hFtpCommand: HINTERNET): BOOL;
stdcall; external "wininet.dll" name "FtpCommandA";
← →
SortoVaritu © (2009-06-22 13:02) [57]Этот прототип отсюдава взят
http://www.cryer.co.uk/brian/delphi/wininet/example_ftpcommand.htm
Только я пробовал менять var hFtpCommand: PHINTERNET на var hFtpCommand: HINTERNET. Результат тот же. Просто на самом деле непонятно, что должна возвращать функция Хэндл или поинтер?
← →
SortoVaritu © (2009-06-22 13:05) [58]FtpCommand(m_hFtpSession,true,FTP_TRANSFER_TYPE_ASCII,
PChar("NLST"),0,@data_handle) Это в примерет так написано.
@data_handle - Это ведь и есть поинтер для Хэндла или я ошибаюсь.
← →
Сергей М. © (2009-06-22 13:16) [59]
> непонятно, что должна возвращать функция Хэндл или поинтер
Читаешь первоисточник - MSDN - и все становится понятным:
__out HINTERNET *phFtpCommand
..
phFtpCommand [out]
A pointer to a handle that is created if a valid data socket is opened. The fExpectResponse parameter must be set to TRUE for phFtpCommand to be filled.
Т.е. если
var
hFile: HINTERNET;
то при
var hFtpCommand: HINTERNET
вызов такой:
FtpCommand(.., hFile)
а при
pFtpCommand: PHINTERNET
вызов уже иной:
FtpCommand(.., @hFile)
← →
SortoVaritu © (2009-06-22 13:17) [60]Будет ли правильным:
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;
← →
Сергей М. © (2009-06-22 13:27) [61]
> что должна возвращать функция Хэндл или поинтер
Она должна вернуть хэндл, записав его по адресу, переданному последним параметром.
← →
SortoVaritu © (2009-06-22 13:36) [62]То есть если записать так
phfile:=@hfile;
FtpCommand(hFtp,true,FTP_TRANSFER_TYPE_ASCII,
PChar("LIST"),0,phfile);
будет верным, т.к
FtpCommand(.., @hFile) компилятор ругается на несовпадение типов
← →
SortoVaritu © (2009-06-22 13:42) [63]Что то я понять не могу.
FtpCommand(hFtp,true,FTP_TRANSFER_TYPE_ASCII,
PChar("LIST"),0,phfile); где phfile:PHinternet. Почему тогда ошибка выпрыгивает. Ведь phfile это адрес где записан хэндл. В чем тогда проблема состоит.
← →
Сергей М. © (2009-06-22 14:24) [64]
> SortoVaritu © (22.06.09 13:42) [63]
что тебе не понятно в [59] ?
← →
clickmaker © (2009-06-22 14:32) [65]да можно и так
function FtpCommand(
hConnect: HINTERNET;
fExpectResponse: BOOL;
dwFlags: DWORD;
lpszCommand: PChar;
dwContext: DWORD;
phFtpCommand: PHINTERNET): BOOL;
stdcall; external "wininet.dll" name "FtpCommandA";
← →
SortoVaritu © (2009-06-22 15:12) [66]Я так понимаю в последнем параметре нужно указать адрес моего хэндла hFTP, дабы функция по этому адресу вывела мне сам хэндл.
← →
Сергей М. © (2009-06-22 15:22) [67]Правильно понимаешь
← →
SortoVaritu © (2009-06-22 15:27) [68]ОК. Баааааааааааааааааааааальшое спасибо за помощь. Премного благодарен. Вечером попробую.
← →
SortoVaritu © (2009-06-23 11:09) [69]Итак. Что получилось.
При таком коде все работает правильно.
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. То выпрыгивает выше упомянутая ошибка с памятью.
← →
Сергей М. © (2009-06-23 11:46) [70]
> 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 ?
Когда ты наконец начнешь читать документацию, прежде чем что-то писать ?)
← →
SortoVaritu © (2009-06-23 12:01) [71]12003 значение взятое не от балды.
Да и причем тут это.
Для того чтобы получить результат вызова InternetGetLastResponseInfo нужно чтобы FtpCommand1(hftp,true,FTP_TRANSFER_TYPE_BINARY ,s ,0,phFile) выполнился. А он выполняется только с командой LIST. А с коммандой RETR нет. Что анализировать если команда не выполняется?
← →
SortoVaritu © (2009-06-23 12:09) [72]>И если вызов InternetGetLastResponseInfo успешен, где анализ значения, возвращенного этой ф-цией в переменную err ?
Как он может быть успешен если прога даж не доходит до выполнения InternetGetLastResponseInfo
← →
Сергей М. © (2009-06-23 12:10) [73]
> А он выполняется
А где в твоем коде видно что выполняется или не выполняется ?
Почему я должен верить тебе на слово ?)
> 12003 значение взятое не от балды
А откуда ?)
> Да и причем тут это
А нашиша тогда ты демонстрируешь этот бестолковый код, не имеющий к проблеме отношения ?
И, наоборот, упрямо не приводишь код, имеющий непосредственное отношение к выяснению проблемы (анализ результатов вызовов API-функций и соотв.ветвления последующего алгоритма) ?
> выше упомянутая ошибка с памятью
Опять адрес забыл ?)
← →
Сергей М. © (2009-06-23 12:11) [74]
> Как он может быть успешен если прога даж не доходит до выполнения
> InternetGetLastResponseInfo
>
Вот как будет доходить, так и будем рассматривать работу InternetGetLastResponseInfo.
А пока это абсолютно бессмысленный код.
← →
SortoVaritu © (2009-06-23 12:21) [75]Так он не бессмысленный. Он работает если команду выполнять LIST. Он мне в файл записывает содержимого каталога. РАБОТАЕТ.
НЕ РАБОТАЕТ при выполнении команды RETR.
В чем же он тогда бессмысленный.
← →
SortoVaritu © (2009-06-23 12:21) [76]Так он не бессмысленный. Он работает если команду выполнять LIST. Он мне в файл записывает содержимого каталога. РАБОТАЕТ.
НЕ РАБОТАЕТ при выполнении команды RETR.
В чем же он тогда бессмысленный.
← →
Сергей М. © (2009-06-23 14:05) [77]
> он не бессмысленный. Он работает если команду выполнять
> LIST
Он бессмысленный при любой команде !
Ф-ция InternetGetLastResponseInfo не получает, а возвращает код ответа сервера !
За ккаким же лешим ты пишешь какое-то число в переменную err, если следом же вызываешь InternetGetLastResponseInfo, задача которой - изменить значение этой переменной в случае успешного выполнения ф-ции ?
← →
Сергей М. © (2009-06-23 15:03) [78]Изучай:
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;
← →
SortoVaritu © (2009-06-23 15:12) [79]За совет, спасибо. Это все я понимаю. То что лишний код оставил, так это у меня всегда такой мусор валяецца. Признаю. Только ведь InternetGetLastResponseInfo не выполняется даже. Софтина останавливается на ошибке памяти.
← →
SortoVaritu © (2009-06-23 15:17) [80]Вот кстати еще хотел спросить. Чем отличается запрос файла командой FTPGetFile и командой RETR.
Страницы: 1 2 3 вся ветка
Форум: "Сети";
Текущий архив: 2011.11.20;
Скачать: [xml.tar.bz2];
Память: 0.62 MB
Время: 0.006 c