Конференция "Сети" » Вопрос по FtpGetFile
 
  • SortoVaritu © (19.06.09 10:17) [0]
    Вопрос в следующем. На FTP лежит несколько файлов. Эти несколько файлов являются разрезанным архивом rar. При использовании FTPGetFile файлы скачиваются на мой компьютер. НО при попытке их собрать в архив имеем ошибку контрольной суммы. Файлы по 100 МБ. Для доступа к FTP используется прокси. В чем может быть проблема?
  • Сергей М. © (19.06.09 11:49) [1]

    > В чем может быть проблема?


    1. На ftp-сервере лежит криво порезаный архив.
    2. Загружены не все файлы из оригинальной нарезки
    2. Кривое использование FtpGetFile
  • SortoVaritu © (19.06.09 11:52) [2]
    1. На ftp-сервере лежит нормально нарезанный файл. (Проверено TC)
    2. Файлы тоже все. Сам резал.
    3. Вот это как раз и интересует. Будет ли разница если скачивать файл как ASCII или бинарный?
  • Сергей М. © (19.06.09 11:57) [3]

    > Будет ли разница если скачивать файл как ASCII или бинарный?


    Конечно будет
  • clickmaker © (19.06.09 12:03) [4]
    в ASCII mode "Control and formatting information is converted to local equivalents."
    т.е. учитываются переводы строки, например. А они разные в *nix, mac и windows системах
  • SortoVaritu © (19.06.09 12:05) [5]
    Тогда вопрос следующий. Файл собирается, ругается на ошибку crc. После в собранный файл (rar архив) можно зайти и увидеть файл который заархивирован. Насколько я понимаю, если я принимаю файл в ASCII то у меня вообще архив бы не открывался и вообще TC его бы не воспринял как архив.
  • SortoVaritu © (19.06.09 12:07) [6]
    Кстати еще могу сказать, что при скачивании маленького файла ~10 МБ все в норме. Такая проблема наблюдается только при скачке большого файла.
  • Сергей М. © (19.06.09 12:13) [7]

    > SortoVaritu ©   (19.06.09 12:05) [5]


    Неправильно понимаешь.

    Заголовок архива в рез-те трансфера заведомо бинарного файла как текстового оказался не испорчен (просто повезло), потому принятый файл и распознается как архив.


    > могу сказать, что при скачивании маленького файла ~10 МБ
    > все в норме


    Опять же см. [1] п.3
  • SortoVaritu © (19.06.09 12:20) [8]
    Вот использование FtpGetFile

    function FtpGetFile(
       hFTP;
       RemName;
       LocName;
       true;
       0;
       FTP_TRANSFER_TYPE_BINARY;
       0);
  • SortoVaritu © (19.06.09 12:24) [9]
    Вот хэндлы

    hNet := InternetOpen('Program_Name',
                           INTERNET_OPEN_TYPE_PRECONFIG,
                           nil,
                           nil,
                           0);

    hFTP := InternetConnect(hNet,
                             MyServer,
                             21,
                             Username,
                             Password,
                             INTERNET_SERVICE_FTP,
                             0,
                             0);
  • Сергей М. © (19.06.09 12:37) [10]
    А где анализ результата вызова ?
  • SortoVaritu © (19.06.09 12:40) [11]
    анализ есть. Это я просто из тела программы вырвал саму FtpGetFile и хэндлы. Грубо говоря если сделано так, что если на FTP в определенный католог не законнектится, то FtpGetFile просто не вызывается.
  • Сергей М. © (19.06.09 12:48) [12]
    А если вызывается, то где анализ возвращенного ею рез-та ?
  • SortoVaritu © (19.06.09 13:02) [13]
    Вот тут и вопрос.
    function FtpGetFile(
      hFTP;
      RemName;
      LocName;
      true;
      0;
      FTP_TRANSFER_TYPE_BINARY;
      0)=FALSE. Всегда. То есть файл скачивается, но FtpGetFile возвращает False все равно.
  • Сергей М. © (19.06.09 13:07) [14]
    Return Value

    Returns TRUE if successful, or FALSE otherwise. To get a specific error message, call GetLastError.
  • SortoVaritu © (19.06.09 13:13) [15]
    Хорошо попробую использовать GetLastError. Но если чисто теоретически, то в чем может быть загвоздка? (ПОнимаю что нужно смотреть GetLastError). Просто на форумах куча примеров и у всех вроде как работает FtpGetFile нормально. И размер файла на сервере и скачанного тоже вроде как идентичны.
  • Сергей М. © (19.06.09 13:16) [16]
    Загвозку есть резон искать лишь после анализа кода отказа.
  • SortoVaritu © (19.06.09 13:18) [17]
    Возможно ли, что хэндлы закрываются быстрее чем выполняется FtpGetFile?
  • Сергей М. © (19.06.09 13:21) [18]
    Ну чего ты гадаешь-то ?)

    Давно уж написал бы

    Win32Check(FtpGetFile(..));

    тогда бы и разговор был предметный о причинах ..
  • SortoVaritu © (19.06.09 13:27) [19]
    Заранее извиняюсь. Сейчас не имею доступа к FTP.
  • Сергей М. © (19.06.09 13:29) [20]
    Ну вот как поимеешь, так сразу и милости просим)
  • SortoVaritu © (20.06.09 00:24) [21]
    Так. Ошибка 12111. Что как я понял означает прерывание сессии с FTP.
  • Сергей М. © (22.06.09 08:58) [22]
    Точно так - FTP-сессия была прервана.
    Ни о каких контр.суммах при этом, естественно, не может идти и речи.
  • SortoVaritu © (22.06.09 09:57) [23]
    Хорошо. А как с этим бороться?
  • brother © (22.06.09 10:12) [24]
    выесняй почему сессия рвется
  • SortoVaritu © (22.06.09 10:19) [25]
    Хм. Трудный вопрос. При скачивании тотал коммандером все ОК. Коммандер использует для этого комманды для FTP. А сессия рвется всегда в самом конце закачки. То есть я так понимаю, что файл скачивается, в последний момент моя софтина отсылает какой-то запрос на сервер и тут выясняется, что сессия уже разорвана.
  • brother © (22.06.09 10:28) [26]
    > А сессия рвется всегда в самом конце закачки

    не факт
  • Сергей М. © (22.06.09 10:31) [27]
    Для начала убедись, что сессию рвет не файрвол и не прокси.
  • brother © (22.06.09 10:32) [28]
    > сессию рвет не файрвол и не прокси

    они не могут этого сделать, тк соединение установлено
  • SortoVaritu © (22.06.09 10:35) [29]
    Вот в том то и дело. Вообщем-то нигде данная ситуация и не описана. Да и в случае с коммандером ведь прокси сессию не рвет, а файервол у меня отрублен.
  • brother © (22.06.09 10:39) [30]
    снифь порт и смотри, в чем различия (твоя прога и командер тотал)))))
  • SortoVaritu © (22.06.09 10:49) [31]
    Есть еще вопрос. Если вместо FTPGetFile использовать FTPCommand. Вернее я это уже пробую. Но есть загвоздка.
    При выполнении FtpCommand(hFtp,true,FTP_TRANSFER_TYPE_BINARY,
       PChar('RETR '+MyFile),0,hFile) у меня выходит ошибка переполнения памяти. А вот комманда FtpCommand(hFtp,true,FTP_TRANSFER_TYPE_ASCII,
       PChar('LIST'),0,hFile) выполняется без проблем.
  • Сергей М. © (22.06.09 10:52) [32]

    > они не могут этого сделать


    Еще как могут
  • brother © (22.06.09 10:59) [33]
    > Еще как могут

    на каком основании позволь полюбопытствовать?
  • SortoVaritu © (22.06.09 10:59) [34]
    Кстати данная проблема не только с моей прогой, но и с некоторыми FTP клиентами.
  • Сергей М. © (22.06.09 11:03) [35]
  • SortoVaritu © (22.06.09 11:08) [36]
    Так я по этой ссылке и читал использование FTPCommand. Там получается, что при успешном выполнении данной комманды должна сгенерироваться переменная hFIle. Так она я так понял и генерируется, только почему то ошибку с памятью выбрасывает.
  • Сергей М. © (22.06.09 11:11) [37]
    Что, вот прямо так и говорит "я, ошибка переполнения памяти, выхожу" или "меня, ошибку, выбросили вместе с памятью" ?

    Ты не в состоянии привести дословный текст увиденного тобой, да ?
  • SortoVaritu © (22.06.09 11:15) [38]
    access violetion at address "адрес не помню". write to address FFFFFFFFF
  • brother © (22.06.09 11:22) [39]
    > только почему то ошибку с памятью выбрасывает.


    > access violetion at address

    мдя(
  • SortoVaritu © (22.06.09 11:24) [40]
    И что сие может озночать
  • brother © (22.06.09 11:38) [41]
    много чего...
  • SortoVaritu © (22.06.09 11:50) [42]
    И как быть
  • Сергей М. © (22.06.09 11:53) [43]

    > как быть


    Адрес запоминать)

    И внимательно изучать прототип ф-ции.
  • SortoVaritu © (22.06.09 11:58) [44]
    а что не так с прототипом функции?
  • Сергей М. © (22.06.09 11:59) [45]
    А я откуда знаю, что у тебя там с ним не так ?
    Мне отсюда не видать)
  • brother © (22.06.09 12:13) [46]
    ну стандартно: ошибка в 17 строке
  • SortoVaritu © (22.06.09 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 © (22.06.09 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 © (22.06.09 12:18) [49]
    Поясните еще hFTP:HINTERNET а hFile:PHINTERNET. В чем разница?
  • brother © (22.06.09 12:20) [50]
    вообще, я думал это хэндлы, но

    > hFTP:HINTERNET а hFile:PHINTERNET. В чем разница?

    хэндл и поинтер?
  • Сергей М. © (22.06.09 12:30) [51]

    > SortoVaritu ©   (22.06.09 12:14) [47]


    Судя по этому прототипу у тебя и 'LIST' не должна работать)
  • SortoVaritu © (22.06.09 12:41) [52]
    FtpCommand(hFtp,true,FTP_TRANSFER_TYPE_BINARY,
    PChar('RETR '+MyFile),0,hFile). Хорошо hFile Это поинтер. А как тогда создать хэндл?
  • Сергей М. © (22.06.09 12:46) [53]
    А как объявлен  PHINTERNET ?
  • SortoVaritu © (22.06.09 12:50) [54]
    PHINTERNET=^HINTERNET
  • SortoVaritu © (22.06.09 12:53) [55]
    может быть

    phFile:=@hFile;
    FtpCommand(hFtp,true,FTP_TRANSFER_TYPE_BINARY,
    PChar('RETR '+MyFile),0,phFile)
  • Сергей М. © (22.06.09 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 © (22.06.09 13:02) [57]
    Этот прототип отсюдава взят
    http://www.cryer.co.uk/brian/delphi/wininet/example_ftpcommand.htm
    Только я пробовал менять var hFtpCommand: PHINTERNET на var hFtpCommand: HINTERNET. Результат тот же. Просто на самом деле непонятно, что должна возвращать функция Хэндл или поинтер?
  • SortoVaritu © (22.06.09 13:05) [58]
    FtpCommand(m_hFtpSession,true,FTP_TRANSFER_TYPE_ASCII,
       PChar('NLST'),0,@data_handle) Это в примерет так написано.
    @data_handle - Это ведь и есть поинтер для Хэндла или я ошибаюсь.
  • Сергей М. © (22.06.09 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 © (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 не выполняется даже. Софтина останавливается на ошибке памяти.
  • SortoVaritu © (23.06.09 15:17) [80]
    Вот кстати еще хотел спросить. Чем отличается запрос файла командой FTPGetFile и командой RETR.
  • Сергей М. © (23.06.09 15:25) [81]

    > у меня всегда такой мусор валяецца


    И кому, как думаешь, интересно или приятно взирать на твой "мусор" ?

    Ты пойми - если ты процитировал некий код, то подразумевается, что ты уверен в том что он имеет прямое отношение к твоей задаче или проблеме в ее решении, т.е. он имеет некое осмысленное немаловажное значение, коль скоро он фигурирует ..


    > Чем отличается запрос файла командой FTPGetFile и командой
    > RETR


    FTPGetFile неявно подает команду RETR, получает содержимое удаленного файла и записывает полученное содержимое в указанный тобой файл.
  • SortoVaritu © (23.06.09 15:52) [82]
    Проще говоря FTPGetFile так же использует команду RETR для доступа к файлу.
  • Сергей М. © (23.06.09 15:56) [83]
    Конечно.
    А как же иначе ?
  • SortoVaritu © (23.06.09 16:27) [84]
    Хм. Тогда я вот думаю. Решится ли мой вопрос с разрывом сессии, если я буду использовать напрямую RETR вместо FTPGETFile.
  • Сергей М. © (23.06.09 16:32) [85]
    Ты уже код [78] изучил ? Опробовал на своих "больших" файлах ? Каковы результаты ?
    Излагай подробно и дословно все что видишь при его выполнении ..
  • SortoVaritu © (25.06.09 10:31) [86]
    Результат точно такой же.
    Access violation at adress 77C32A16 in module msvcrt.dll. Read of adress FFFFFFFF
  • Сергей М. © (25.06.09 10:53) [87]
    Что за ОС ? Какая версия Делфи ?
  • SortoVaritu © (25.06.09 10:59) [88]
    Windows XP SP3. Delphi 7.
    Я вот тоже думаю, что не в проге дело.
  • Сергей М. © (25.06.09 11:05) [89]
    Ты это код пробовал "один в один" ?
    Или свои изменения внес ?
    Если внес, показывай весь этот фрагмент со своими изменениями ..
  • SortoVaritu © (25.06.09 11:11) [90]
    код внес один в один. только сервер свой подставил ну и имя файла тож который на сервере лежит а так один в один
  • Сергей М. © (25.06.09 11:25) [91]

    > код внес один в один. только сервер свой подставил


    И это ты называешь "один в один" ?)
    Приводи текст с изменениями ..
  • SortoVaritu © (25.06.09 11:41) [92]
    function FtpCommand(
     hConnect: HINTERNET;
     fExpectResponse: BOOL;
     dwFlags: DWORD;
     lpszCommand: PChar;
     dwContext: DWORD;
     var hFtpCommand: HINTERNET): BOOL;
     stdcall; external 'wininet.dll' name 'FtpCommandA';

    const
    url = 'vh22.win.hoster.by';

    procedure TForm1.Button5Click(Sender: TObject);
    var
    hInet, hFTPSession, hFile: HINTERNET;
    RCode, RTLen: Cardinal;
    RText: String;
    begin
    hInet := InternetOpen('FTP', INTERNET_OPEN_TYPE_DIRECT, nil, nil, 0);
    Win32Check(Assigned(hInet));
    try
      hFTPSession := InternetConnect(hInet, 'vh22.win.hoster.by', 21, login, password, INTERNET_SERVICE_FTP, INTERNET_FLAG_PASSIVE, 0);
      Win32Check(Assigned(hFTPSession));
      try
        Win32Check(FtpCommand(hFTPSession, True, FTP_TRANSFER_TYPE_BINARY, 'RETR 1.txt', 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;

  • Сергей М. © (25.06.09 12:15) [93]

    > Для доступа к FTP используется прокси


    Ну и где у тебя в коде используется прокси ?
    Нпапрямую же лезешь к ресурсу ..
  • SortoVaritu © (25.06.09 12:23) [94]
    Блин. Я уже и прокси не использую. На прямую делаю. Чтобы исключить любую вероятность его вмешательства.
  • Сергей М. © (25.06.09 12:40) [95]
    И какой же размер у 1.txt ?
  • Сергей М. © (25.06.09 12:45) [96]

    > На прямую делаю


    Доступ в Тырнет у тебя прямой или из корп.сети ?
  • SortoVaritu © (25.06.09 12:50) [97]
    У меня есть и такой и такой. Все это я делаю дома. Дома у меня доступ прямой. Прямое соединение через провайдера.
  • Сергей М. © (25.06.09 12:57) [98]
    Хочешь сказать, что способ доступа не влияет ?

    Т.е. один и тот же код (без использования прокси) не работает ни здесь ни там, возбуждая одно и тио же исключение на одной и той же строчке ?

    Ну хорошо.
    А мой код (один в один или без использования прокси) ТОЖЕ возбуждает исключение при разных условиях способах доступа ?
  • SortoVaritu © (25.06.09 13:21) [99]
    Так точно. FTPCommand выбрасывает одну и ту же ошибку
  • Сергей М. © (25.06.09 13:33) [100]
    А как узнал, что имеенно FTPCommand, а не что-то иное ?
    В отладике пошагово или как ?
  • SortoVaritu © (25.06.09 14:54) [101]
    Да. Пошагово отлаживал.
  • Сергей М. © (25.06.09 15:51) [102]
    А декларация FTPCommand у тебя случаем не кривая ?
    Покажи-ка ее ..
  • SortoVaritu © (25.06.09 16:02) [103]
    function FtpCommand(
    hConnect: HINTERNET;
    fExpectResponse: BOOL;
    dwFlags: DWORD;
    lpszCommand: PChar;
    dwContext: DWORD;
    var hFtpCommand: HINTERNET): BOOL;
    stdcall; external 'wininet.dll' name 'FtpCommandA';
    Если ты это имеешь ввиду, то я же у тебя ее и скопировал. Только вот последний параметр меня смущает.
  • Сергей М. © (25.06.09 16:29) [104]

    > последний параметр меня смущает


    Он тебя не должен смущать, ибо у меня код успешно работает.
    А что собссно смущает-то ? Уже жевали-пережевали этот вопрос в начале топика ..
  • SortoVaritu © (25.06.09 17:12) [105]
    Хотя в общем ты прав. Думаешь проблема с компилятором или с с системой? Возможно с Wininet.dll?
  • Сергей М. © (25.06.09 17:25) [106]
    Ты экспериментируешь в заведомо "чистом" тестовом проекте или в "боевом" ?
  • SortoVaritu © (25.06.09 18:21) [107]
    В чистом проекте. Твой код я вставил в абсолютно чистый проект.
 
Конференция "Сети" » Вопрос по FtpGetFile
Есть новые Нет новых   [134435   +33][b:0.001][p:0.004]