Конференция "Сети" » Вопрос по FtpGetFile
 
  • SortoVaritu © (22.06.09 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;
  • Сергей М. © (22.06.09 13:27) [61]

    > что должна возвращать функция Хэндл или поинтер


    Она должна вернуть хэндл, записав его по адресу, переданному последним параметром.
  • SortoVaritu © (22.06.09 13:36) [62]
    То есть если записать так
    phfile:=@hfile;
    FtpCommand(hFtp,true,FTP_TRANSFER_TYPE_ASCII,
      PChar('LIST'),0,phfile);
    будет верным, т.к
    FtpCommand(.., @hFile) компилятор ругается на несовпадение типов
  • SortoVaritu © (22.06.09 13:42) [63]
    Что то я понять не могу.
    FtpCommand(hFtp,true,FTP_TRANSFER_TYPE_ASCII,
     PChar('LIST'),0,phfile); где phfile:PHinternet. Почему тогда ошибка выпрыгивает. Ведь phfile это адрес где записан хэндл. В чем тогда проблема состоит.
  • Сергей М. © (22.06.09 14:24) [64]

    > SortoVaritu ©   (22.06.09 13:42) [63]


    что тебе не понятно в [59] ?
  • clickmaker © (22.06.09 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 © (22.06.09 15:12) [66]
    Я так понимаю в последнем параметре нужно указать адрес моего хэндла hFTP, дабы функция по этому адресу вывела мне сам хэндл.
  • Сергей М. © (22.06.09 15:22) [67]
    Правильно понимаешь
  • SortoVaritu © (22.06.09 15:27) [68]
    ОК. Баааааааааааааааааааааальшое спасибо за помощь. Премного благодарен. Вечером попробую.
  • SortoVaritu © (23.06.09 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. То выпрыгивает выше упомянутая ошибка с памятью.
  • Сергей М. © (23.06.09 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 © (23.06.09 12:01) [71]
    12003 значение взятое не от балды.
    Да и причем тут это.
    Для того чтобы получить результат вызова InternetGetLastResponseInfo нужно чтобы FtpCommand1(hftp,true,FTP_TRANSFER_TYPE_BINARY   ,s ,0,phFile) выполнился. А он выполняется только с командой LIST. А с коммандой RETR нет. Что анализировать если команда не выполняется?
  • SortoVaritu © (23.06.09 12:09) [72]
    >И если вызов InternetGetLastResponseInfo успешен, где анализ значения, возвращенного этой ф-цией в переменную err ?

    Как он может быть успешен если прога даж не доходит до выполнения InternetGetLastResponseInfo
  • Сергей М. © (23.06.09 12:10) [73]

    > А он выполняется


    А где в твоем коде видно что выполняется или не выполняется ?
    Почему я должен верить тебе на слово ?)


    > 12003 значение взятое не от балды


    А откуда ?)


    > Да и причем тут это


    А нашиша тогда ты демонстрируешь этот бестолковый код, не имеющий к проблеме отношения ?
    И, наоборот, упрямо не приводишь код, имеющий непосредственное отношение к выяснению проблемы (анализ результатов вызовов API-функций и соотв.ветвления последующего алгоритма) ?


    > выше упомянутая ошибка с памятью


    Опять адрес забыл ?)
  • Сергей М. © (23.06.09 12:11) [74]

    > Как он может быть успешен если прога даж не доходит до выполнения
    > InternetGetLastResponseInfo
    >


    Вот как будет доходить, так и будем рассматривать работу InternetGetLastResponseInfo.

    А пока это абсолютно бессмысленный код.
  • SortoVaritu © (23.06.09 12:21) [75]
    Так он не бессмысленный. Он работает если команду выполнять LIST. Он мне в файл записывает содержимого каталога. РАБОТАЕТ.
    НЕ РАБОТАЕТ при выполнении команды RETR.
    В чем же он тогда бессмысленный.
  • SortoVaritu © (23.06.09 12:21) [76]
    Так он не бессмысленный. Он работает если команду выполнять LIST. Он мне в файл записывает содержимого каталога. РАБОТАЕТ.
    НЕ РАБОТАЕТ при выполнении команды RETR.
    В чем же он тогда бессмысленный.
  • Сергей М. © (23.06.09 14:05) [77]

    > он не бессмысленный. Он работает если команду выполнять
    > LIST


    Он бессмысленный при любой команде !
    Ф-ция InternetGetLastResponseInfo не получает, а возвращает код ответа сервера !
    За ккаким же лешим ты пишешь какое-то число в переменную err, если следом же вызываешь InternetGetLastResponseInfo, задача которой - изменить значение этой переменной в случае успешного выполнения ф-ции ?
  • Сергей М. © (23.06.09 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 © (23.06.09 15:12) [79]
    За совет, спасибо. Это все я понимаю. То что лишний код оставил, так это у меня всегда такой мусор валяецца. Признаю. Только ведь InternetGetLastResponseInfo не выполняется даже. Софтина останавливается на ошибке памяти.
 
Конференция "Сети" » Вопрос по FtpGetFile
Есть новые Нет новых   [134435   +33][b:0][p:0.002]