Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 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.007 c
15-1311763634
KSergey
2011-07-27 14:47
2011.11.20
Про хитро-задачки


15-1311366602
Юрий
2011-07-23 00:30
2011.11.20
С днем рождения ! 23 июля 2011 суббота


9-1190053787
Mr.Vlad
2007-09-17 22:29
2011.11.20
Targa&amp;Viewer


3-1266323284
Mike Kouzmine
2010-02-16 15:28
2011.11.20
Беда с двойной точностью


15-1311453004
Юрий
2011-07-24 00:30
2011.11.20
С днем рождения ! 24 июля 2011 воскресенье





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский