Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Сети";
Текущий архив: 2006.02.12;
Скачать: [xml.tar.bz2];

Вниз

Прервать выполнение функции RasDial   Найти похожие ветки 

 
Дмитрий_05   (2005-10-12 12:32) [0]

Я как понял работает все это вот как: вызывается функция RasDial(nil, nil, dParam, 0, @RasCallBack, hRas); и по ходу ее выполнения посылает сообщения функции procedure RasCallBack(Msg: Integer; State: TRasConnState; Error: Integer); stdcall; и уже в этой функции обрабатывать те или иные события. А вот можно ли прервать выполнение функции RasDial?


 
$hade   (2005-10-13 13:51) [1]

собсно RasHangUp


 
Дмитрий_05   (2005-10-18 20:16) [2]

Всеравно иногда не выключается. У меня в процедуре RasCallBack идет следующий код:

FConnect: boolean // переменная, которая определяет перезванивать или нет, т.е. при нажатии на "Connect" FConnect:=true, а на "Disconnect" FConnect:=false

if Error <> 0 then
 begin
 RasGetErrorString(Error, C, 100);
 if C <> "" then Form1.Label5.Caption := C; //иногда бывает что C="", почему не знаю
 if FConnect then Connect; // в этой процедуре и находится процедура RasDial

procedure TForm1.Connect;  // процедура Connect
begin
if hRas <> 0 then RasHangUp(hRas);
hRas := 0;

Application.ProcessMessages;
if RasDial(nil, nil, dParam, 0, @RasCallBack, hRas) <> 0 then
 begin
 //Sleep(1000);
 if FConnect = true then Connect;
 end;
end;

так вот незнаю почему, иногда бывает так, что нажмешь на "Disconnect", а звонить всеравно продолжает... В чем дело?


 
stozlen   (2005-10-19 02:50) [3]

var
  RasDialer: TRasDialer;

procedure Button1Click(Sender: TObject);
begin
  RasDieler.HangUp;
end;


 
$hade   (2005-10-19 09:25) [4]

> if FConnect then Connect; // в этой процедуре и находится процедура RasDial

> if FConnect = true then Connect;

а зачем вызываешь connect и рекурсивно в connect и в самом  RasCallBack?
из Connect рекурсию убери...(тем более что RasDial вызывается у тебя асинхронно и сразу после вызова вернёт управление обратно...)
а на Disconnect
Fconnect:=false;
RasHangUp(hRas);

после вызова HangUp произойдет вызов rasCallback с кодом ошибки(или состояния) = 619 (порт закрыт) - можешь считать и это отменой =)

кста(подсказочка)...
на Disconnect (да и в любом месте где вызываешь RasHangUp)
    RasHangUp;
    repeat Sleep(0);
  until RasGetConnectStatus(hCurrentConnection,Stat)<> ERROR_INVALID_HANDLE;

(грубо говоря - не все модемы "одинаково полезны" - некоторым надо время на HangUp =)


 
Дмитрий_05   (2005-10-21 12:33) [5]

А в функции RasGetConnectStatus, из примера $hade (19.10.05 09:25) [4], наверно нужно вместо переменной hCurrentConnection поставить hRas, ведь в ней же хендл соединения хранится..? и переменную Stat просто в var-е объявить как TRasConnStatusA?


 
$hade   (2005-10-21 14:48) [6]

Так точно =) просто выдрал из своего кода и не все поправил. сорри =)


 
Дмитрий_05   (2005-10-21 17:40) [7]

а нужно перед тем как вызвать функцию RasGetConnectStatus, выполнить следующее, Stat.dwSize := SizeOf(TRasConnStatusA); :

var
Stat: TRasConnStatusA;
...
begin
RasHangUp(hRas);

Stat.dwSize := SizeOf(TRasConnStatusA);   // эта строка нужна?
repeat
 Sleep(0);
until
 RasGetConnectStatus(hRas, fStatus) <> ERROR_INVALID_HANDLE;

hRas := 0;


 
Дмитрий_05   (2005-10-22 13:50) [8]

Почему-то когда я нажимаю на кнопку "Disconnect", у меня программа виснет... наверно это из за этого цикла...


 
Дмитрий_05   (2005-10-22 19:27) [9]

???


 
Дмитрий_05   (2005-10-23 14:55) [10]

т.е. цикл выполняется вечно...


 
$hade   (2005-10-25 13:02) [11]

удостоверся что мсенно в этом куске кода...

вот remark из MSDN по поводу Rashangup

The connection is terminated even if the RasDial call has not yet been completed.

After this call, the hrasconn handle can no longer be used.

An application should not call RasHangUp and then immediately exit. The connection state machine needs time to properly terminate. If the system prematurely terminates the state machine, the state machine can fail to properly close a port, leaving the port in an inconsistent state. Also, an immediate attempt to use the same connection may fail leaving the connection unusable. A simple way to avoid these problems is to call Sleep(3000) after returning from RasHangUp; after that pause, the application can exit. A more responsive way to avoid these problems is, after returning from RasHangUp, to call RasGetConnectStatus(hrasconn) and Sleep(0) in a loop until RasGetConnectStatus returns ERROR_INVALID_HANDLE.

можешь попробовать на самом деле поставить Sleep(3000) и все...
у меня были проблемы на некоторых софтовых модемах иногда...


 
Дмитрий_05   (2005-10-26 18:56) [12]

а может лучше не использовать этот цикл вообще? у меня без него все нормально работает...


 
$hade   (2005-10-26 21:09) [13]

можешь и не использовать конечно...

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


 
Дмитрий_05   (2005-10-27 14:47) [14]

еще маленький вопросик по поводу RasDial, точнее RasCallBack, вобщем если интернет сам разединится по какой-то причине, в RasCallBack я ловлю RASCS_Disconnected, а оно не ловится что-то... т.е, сама программа "думает" что я все еще в интернете...(((


 
$hade   (2005-10-27 15:01) [15]

а при разрыве соеднения вызывается вообще RasCallback?
если да - с каким State и Error? По ним и определяй что произошол разрыв...
если нет - то я думаю что это не программа а модем "думает" что он подключён...

больше ща не подскажу..устал и не помню ниччё...=)


 
Дмитрий_05   (2005-10-27 15:13) [16]

какраз по State и определяю... соединение при разрыве (в трее два компъютера пропадают)

RasDial(nil, nil, dParam, 0, @RasCallBack, hRas);  //так я вызываю RasDial

procedure RasCallBack(Msg: Integer; State: TRasConnState; Error: Integer); stdcall;                                                        // сама RasCallBack
var
C: array[0..100] of Char;
i: integer;
s: ShortString;
Str: TStrings;
begin
if Error <> 0 then
 begin
 RasGetErrorString(Error, C, 100);
 if C <> "" then  // почему-то иногда бывает C=""
   Form1.Label5.Caption := C;

 if FConnect then Form1.Connect;
 end
else
 begin
   case State of
     RASCS_OpenPort: Form1.Label3.Caption := "Opening port";
     RASCS_PortOpened: Form1.Label3.Caption := "Port opened";
     RASCS_ConnectDevice: Form1.Label3.Caption := "Connecting device";
     RASCS_DeviceConnected: Form1.Label3.Caption := "Device connected";
     RASCS_AllDevicesConnected: Form1.Label3.Caption := "All devices connected";
     RASCS_Authenticate: Form1.Label3.Caption := "Start authenticating";
     RASCS_AuthNotify: Form1.Label3.Caption := "Authentication: notify";
     RASCS_AuthRetry: Form1.Label3.Caption := "Authentication: retry";
     RASCS_AuthCallback: Form1.Label3.Caption := "Authentication: callback";
     RASCS_AuthChangePassword: Form1.Label3.Caption := "Authentication: change password";
     RASCS_AuthProject: Form1.Label3.Caption := "Authentication: projecting";
     RASCS_AuthLinkSpeed: Form1.Label3.Caption := "Authentication: link speed";
     RASCS_AuthAck: Form1.Label3.Caption := "Authentication: acknowledge";
     RASCS_ReAuthenticate: Form1.Label3.Caption := "Authentication: reauthenticate";
     RASCS_Authenticated: Form1.Label3.Caption := "Authenticated";
     RASCS_PrepareForCallback: Form1.Label3.Caption := "Preparing for callback";
     RASCS_WaitForModemReset: Form1.Label3.Caption := "Waiting for modem reset";
     RASCS_WaitForCallback: Form1.Label3.Caption := "Waiting for callback";
     RASCS_Projected: Form1.Label3.Caption := "Projected";
     RASCS_StartAuthentication: Form1.Label3.Caption := "Start authentication";
     RASCS_CallbackComplete: Form1.Label3.Caption := "Callback complete";
     RASCS_LogonNetwork: Form1.Label3.Caption := "Logging on network";

     RASCS_Interactive: Form1.Label3.Caption := "Interactive";
     RASCS_RetryAuthentication: Form1.Label3.Caption := "Retry Authentication";
     RASCS_CallbackSetByCaller: Form1.Label3.Caption := "Callback set by caller";
     RASCS_PasswordExpired: Form1.Label3.Caption := "Password expired";

     RASCS_Connected: begin
                      Form1.Label3.Caption := "OnLine...";  // это все для красоты и наглядности )))
                      Form1.Label3.Font.Color := clLime;
                      Form1.Timer1.Enabled := false;
                      Form1.Label3.Visible := true;
                      end;

     RASCS_Disconnected: Form1.Label3.Caption := "Disconnected";  // даже это не пишет
   end;
 end;
end;


мне не понятно еще с переменной C, почему она иногда ничему не равна, я ничего в Label не меняю если она ничему не равна, может лучше писать типа "неизвестная ошибка", или какнибудь так?


 
$hade   (2005-10-27 15:37) [17]

так он(RasCallback) вообще вызывается при дисконнекте то??
какие значения у State и Error  _в_числах_ ?

на счёт С - незнаю, бывает такое, похоже мелкософт сам не придумал как описать эти ошибки...=)


 
Дмитрий_05   (2005-10-27 16:24) [18]

а как тогда определять что произошло разъединение? я думал что через RasCallBack... Значения в State и Error :

State:

const

 RASCS_OpenPort = 0;
 RASCS_PortOpened = 1;
 RASCS_ConnectDevice = 2;
 RASCS_DeviceConnected = 3;
 RASCS_AllDevicesConnected = 4;
 RASCS_Authenticate = 5;
 RASCS_AuthNotify = 6;
 RASCS_AuthRetry = 7;
 RASCS_AuthCallback = 8;
 RASCS_AuthChangePassword = 9;
 RASCS_AuthProject = 10;
 RASCS_AuthLinkSpeed = 11;
 RASCS_AuthAck = 12;
 RASCS_ReAuthenticate = 13;
 RASCS_Authenticated = 14;
 RASCS_PrepareForCallback = 15;
 RASCS_WaitForModemReset = 16;
 RASCS_WaitForCallback = 17;
 RASCS_Projected = 18;
{$IFNDEF WINVER31}
 RASCS_StartAuthentication = 19;
 RASCS_CallbackComplete = 20;
 RASCS_LogonNetwork = 21;
{$ENDIF}

 RASCS_Interactive = RASCS_PAUSED;
 RASCS_RetryAuthentication = RASCS_PAUSED + 1;
 RASCS_CallbackSetByCaller = RASCS_PAUSED + 2;
 RASCS_PasswordExpired = RASCS_PAUSED + 3;

 RASCS_Connected = RASCS_DONE;
 RASCS_Disconnected = RASCS_DONE + 1;


Error я не трогаю т.к. вывожу всеравно строкой в Label-е


 
$hade   (2005-10-27 16:30) [19]

еще раз:
так он(RasCallback) вообще вызывается при дисконнекте то??
"и с какими значениями State и Error?" я имею ввиду...


 
Дмитрий_05   (2005-10-27 17:04) [20]

незнаю, вызывается или нет, по идее должен


 
$hade   (2005-10-28 06:32) [21]

мдям....случай тяжелый )
про отладку программ чтонить знаешь?

дозвонись из программы,
поставь breakpoint на первую строку в rascallback
и тупо выдерни шнур телефонной сети из модема...
если rascallback вызывается - выполнение программы остановится на breakpoint"е. И ты,поднеся мышку к переменной State или Error, сможешь посмотреть ее значение в данный момент...


 
Дмитрий_05   (2005-10-31 17:02) [22]

сделал... rascallback не вызывается... т.е. как работала программа так и работает, "думая" что в интернете... а что делать тогда?


 
Дмитрий_05   (2005-11-01 13:33) [23]

Как мне определять что произошло отключение?


 
Дмитрий_05   (2005-11-01 16:54) [24]

а еще ошибки иногда странно бываеют пишутся... то просто "v" а бывает какие-то символы... но это очень редко... такое ощущение что лучше самом все ошибки еще описать...


 
Дмитрий_05   (2005-11-03 18:28) [25]

$hade помоги пожалуйста!



Страницы: 1 вся ветка

Форум: "Сети";
Текущий архив: 2006.02.12;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.52 MB
Время: 0.039 c
2-1138170238
Mike48
2006-01-25 09:23
2006.02.12
А поясните ещё немного про EhLib.......


1-1136819117
em
2006-01-09 18:05
2006.02.12
является ли listview потокозащищенным


3-1133920771
Silver...
2005-12-07 04:59
2006.02.12
Ограничить запрос (типа TOP <n> тока наооборот)


2-1138066517
stef
2006-01-24 04:35
2006.02.12
Динамический массив


8-1125577299
Sanctus
2005-09-01 16:21
2006.02.12
Webcam





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский