Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Ошибка при закрытии формы с ФТП-сессией.

1
03 июня 2005 года
kot_
7.3K / / 20.01.2000
Для приложения написана длл осуществляющая в случае отсутствия соединения с интернетом дозвон с соединением по умолчанию и запуск ФТП-сессии. Все работает нормально, но есть одно но - если пользователь решает прервать соединение или же его сбрасывает сервер - форма закрывается (это нормально) и вылетает сообщение - Исключение в модуле nmfast60.bpl. Ошибка доступа по адресу 0хХХХХ. Если же подключение сбрасывает сервер - вылетает сообщение типа Server retire to peer connection - форма опять же закрывается(нормально) - и опять экзепшен (что не хотелось бы...)). При этом я почему-то не могу перехватить вот то самое сервер ретайр. Может кто сталкивался?
Код принудительного завершения соединения:
 
Код:
ConnectSocketError=1;//Закрытая переменная класса TfmMainFtp
ClientCloseFtp();
Close();

Обработка события закрытия формы:
 
Код:
if(ConnectSocketError)SendMessage(FormParent,WM_ABORT_USER,0,0);
 Action = caFree;

Обработка запроса на закрытие формы
 
Код:
if(ftpMain->Connected){
 ftpMain->Disconnect();//Компонент TNMFTP
 }
 rasMain->HangUp();//Компонент осуществляющий дозвон
 delete rasMain;
 LogEvents("Çàâåðøåíèå ðàáîòû");//Функция логирования событий

Закрытие соединения:
 
Код:
bool __fastcall TfmMainFtp::ClientCloseFtp()
{
if(ConnectSocketError)
ftpMain->Abort();
else ftpMain->Disconnect();
return true;
}

Ну вроде все.
488
03 июня 2005 года
Mоngооsе
465 / / 01.04.2005
Ты пробовал словить исключение, через TApplication.OnExeption? Хотя причину исключения это не исправляет, но хоть баг незаметен :)
1
03 июня 2005 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by Mоngооsе
Ты пробовал словить исключение, через TApplication.OnExeption? Хотя причину исключения это не исправляет, но хоть баг незаметен :)


Чел, в программе которого загружается длл говорит, что все эксепшены ловит. Но это почемуто не перехватывается. А в делке как мне его перехватить, если форма уже закрылась, а длл он не выгрузил?

488
03 июня 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by kot_
Чел, в программе которого загружается длл говорит, что все эксепшены ловит. Но это почемуто не перехватывается. А в делке как мне его перехватить, если форма уже закрылась, а длл он не выгрузил?

Ага. Нужно бы проверить кто инициализировал закрытие формы. Напр. какая-то кнопка Close или SYSCOMMAND событие. Если SYSCOMMAND и форма не имеет кнопки [x], тогда видимо dll полетел и нет смыла обращаться к его компонентам.

1
03 июня 2005 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by Mоngооsе
Ага. Нужно бы проверить кто инициализировал закрытие формы. Напр. какая-то кнопка Close или SYSCOMMAND событие. Если SYSCOMMAND и форма не имеет кнопки [x], тогда видимо dll полетел и нет смыла обращаться к его компонентам.


Закрытие формы инициирую я. Кнопка отсутствует. И при нормальном завершении работы без проблем. Сейчас попробую заглушить обработку ошибок фтп-компонента, может в этом причина.

1
03 июня 2005 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by kot_
Закрытие формы инициирую я. Кнопка отсутствует. И при нормальном завершении работы без проблем. Сейчас попробую заглушить обработку ошибок фтп-компонента, может в этом причина.


Нет причина не в этом. Отключил всю обработку в компоненте - исключение все равно появляется

488
03 июня 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by kot_
Нет причина не в этом. Отключил всю обработку в компоненте - исключение все равно появляется

Пасс. В прошлом году у тебя была такая же проблема с dll.

P.S. А если убрать Action = caFree; ?

1
03 июня 2005 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by Mоngооsе
Пасс. В прошлом году у тебя была такая же проблема с dll.

P.S. А если убрать Action = caFree; ?


ERangeCheckError или еще какаято по очереди(вылетело из головы) - это раз. Память не очищается - это два. Ну может проблема и схожа - но там проще было - форма запускалась в модальном режиме и мне можно было четко отследить момент загрузки выгрузки. Здесь же форма открывается не модально и момент закрытия не предсказуем. Вариант конечно - запретить пользователю закрывать окно - но это не выход.:)

488
03 июня 2005 года
Mоngооsе
465 / / 01.04.2005
Цитата:
Originally posted by kot_
ERangeCheckError или еще какаято по очереди(вылетело из головы) - это раз. Память не очищается - это два. Ну может проблема и схожа - но там проще было - форма запускалась в модальном режиме и мне можно было четко отследить момент загрузки выгрузки. Здесь же форма открывается не модально и момент закрытия не предсказуем. Вариант конечно - запретить пользователю закрывать окно - но это не выход.:)


Фигней вы ей богу страдаете. Приложив немного ума и старния можно вполне спокойно найти ошибку. Ничего военного здесь нет. Если не наблюдается ни того ни другого - ... Ну а если уж совсем билдеровский прогамер - ну тоды оставь как есть. Звиняй за резкость.

Это чей, немношко измененный пост? :D

Но если всерьез, и конечно как последнее средство, я бы или с Spy или с hook оределил бы какое сообщение получает приложение при сбое и обработал бы в PreTranslateMessage. Конечно в деле это может оказаться не таким уж гладким, как на бумаге...

1
03 июня 2005 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by Mоngооsе
Фигней вы ей богу страдаете. Приложив немного ума и старния можно вполне спокойно найти ошибку. Ничего военного здесь нет. Если не наблюдается ни того ни другого - ... Ну а если уж совсем билдеровский прогамер - ну тоды оставь как есть. Звиняй за резкость.

Это чей, немношко измененный пост? :D

Но если всерьез, и конечно как последнее средство, я бы или с Spy или с hook оределил бы какое сообщение получает приложение при сбое и обработал бы в PreTranslateMessage. Конечно в деле это может оказаться не таким уж гладким, как на бумаге...


Да вот этим и занимаюсь...:) Проблема как выяснилась, в том, что компонент выполняет листинг директории в момент разрыва связи. Именно это и провоцировало эксепшин и/или ошибки. Правда я считал, что выполнение команды Abort() завершает соединение и прерывает операции но видно я ошибался.

1
18 июня 2005 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by kot_


В общем решение проблемы в следующем - выкинул нафиг все VCL-компоненты доступа. Проблема исчезла.:)
По видимому возникновение ошибки можно былобы предотвратить используя при закрытии формы что ни будь типа Wait* - то есть закрывать форму только после того, как компонент завершит все потоки, но решил с этим не заморачиваться и использовать инетапи - гораздо стабильней начало работать.

246
21 июня 2005 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by kot_

...
решил с этим не заморачиваться и использовать инетапи - гораздо стабильней начало работать.


А через инетапи у тебя качать с докачкой умеет?

1
23 июня 2005 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by GIZMO
А через инетапи у тебя качать с докачкой умеет?


Пока нет. На ближайшее будущее в функционале это не нужно, а в далеком - планируется полный отказ от ФТП.:)
Но кстати, это возможно? Среди АПИ-мне вроде не попадались функции позволяющие читать по байтам в поток. А может смотрел не внимательно.

246
23 июня 2005 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by kot_

...
Но кстати, это возможно? Среди АПИ-мне вроде не попадались функции позволяющие читать по байтам в поток. А может смотрел не внимательно.


FtpCommand(HINTERNET hConnect,
BOOL fExpectResponse,
DWORD dwFlags,
LPCTSTR lpszCommand,
DWORD_PTR dwContext,
HINTERNET* phFtpCommand
);
Сам пока не добрался, думал у тебя есть готовое...
WinInet - вообщем-то штука удобная, но за...ся в этих флагах и константах разбираться.

1
23 июня 2005 года
kot_
7.3K / / 20.01.2000
Цитата:
Originally posted by GIZMO
FtpCommand(HINTERNET hConnect,
BOOL fExpectResponse,
DWORD dwFlags,
LPCTSTR lpszCommand,
DWORD_PTR dwContext,
HINTERNET* phFtpCommand
);
Сам пока не добрался, думал у тебя есть готовое...
WinInet - вообщем-то штука удобная, но за...ся в этих флагах и константах разбираться.


В МСДН пример выглядит так:

Код:
...//Установка соединения опущена.
 HINTERNET hResponse;  // To be used for the response info
   
    BOOL bRet = FtpCommand(hConnection, // WinInet Connection handle
                           TRUE,        // Yes, I expect a response
                           FTP_TRANSFER_TYPE_ASCII, // I'm receiving ASCII
                           "LIST",      // This is the FTP command I am passing
                           0,           // No context needed
                           &hResponse); // The handle to read the response
    if (!bRet)
    {
        cout << "FtpCommand failed, error: " << GetLastError() << endl;
        return;
    }

    char buff[4096];
    DWORD dwBytesRead;

    // Read the response
    bRet = InternetReadFile(hResponse,
                            buff,
                            4095,
                            &dwBytesRead);
    if (!bRet)
    {
        cout << "InternetReadFile failed, error: " << GetLastError() << endl;
        return;
    }
    // Null terminate response
    buff[dwBytesRead] = 0;

    cout << "Buffer:\n" << buff << endl;
}
246
24 июня 2005 года
GIZMO
1.8K / / 30.07.2004
Цитата:
Originally posted by kot_
В МСДН пример выглядит так:
 
Код:
...


А Я начал делать так:

Код:
HINTERNET hSession = NULL;
    HINTERNET hConnect = NULL;

    hSession = InternetOpen ("FTP Session",
        INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);

    if(hSession)
        Memo1->Lines->Add("InternetSession OK");
    else  {
        Memo1->Lines->Add("InternetSession FAILED");
        return;
    }

    hConnect = InternetConnect(hSession,
                    "10.3.10.163",
                    INTERNET_DEFAULT_FTP_PORT,
                    NULL,
                    NULL,
                    INTERNET_SERVICE_FTP,
                    NULL,
                    NULL
                    );
    if(hConnect)
        Memo1->Lines->Add("InternetConnect OK");
    else {
        Memo1->Lines->Add("InternetConnect FAILED");
        return;
    }

    String command("REST 0");

    HINTERNET hResponse = NULL;

    BOOL Ret = FtpCommand(hConnect,
               FALSE,
               FTP_TRANSFER_TYPE_BINARY,
               command.c_str(),
               NULL,
               &hResponse);

    if(!Ret)
    {
       Memo1->Lines->Add("&#196;&#238;&#234;&#224;&#247;&#234;&#224; &#237;&#229; &#239;&#238;&#228;&#228;&#229;&#240;&#230;&#232;&#226;&#224;&#229;&#242;&#241;&#255;");
       return;
    }
    else
       Memo1->Lines->Add("&#196;&#238;&#234;&#224;&#247;&#234;&#224; &#239;&#238;&#228;&#228;&#229;&#240;&#230;&#232;&#226;&#224;&#229;&#242;&#241;&#255;");
    ...

???
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог