Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Вопрос по RAS-соединению


Автор: Олег_Игоревич 8.4.2005, 18:34
Доброго Вам времени суток!
Я вызываю функцию RASDIAL для тогот чтобы дозвониться до провайдера. Во время коннекта
вызываю RashangUp для разъединения соединения. При попытке дозвониться до провайдера повторно возникает ошибка:это подключение было прервано (использую функцию RasCallBack в качестве параметра в функции RasDial - R:=RasDial(Nil, Nil, DialParams, 0,@RasCallBack, hRAS);).
Очень хочу узнать как дозвониться до провайдера повторно без возникновения этой ошибки!!!
Заранее спасибо!!! smile smile

Автор: Poseidon 9.4.2005, 01:56
Уважаемый Олег_Игоревич. Как говориться: "Ошибка в 17 строке" А если серьезно, то укажите код, каторым вы дозваниваетесь и отсоединяетесь и вам помогут. А то, что вы привели только функции, не много дает. Может у вас ошибка еще где? Выложите код!

Автор: Олег_Игоревич 9.4.2005, 18:09
Для кнопки "Дозвониться" следующий код:

Код

procedure TForm1.Button2Click(Sender: TObject);
var
  Fp                  : LongBool;
  R                   : Integer;
  C                   : Array[0..100] of Char;
  DialParams          : TRasDialParams;
  AEntryDial          : String;
begin
If ListBox1.ItemIndex<0 Then Exit;

AEntryDial:=ListBox1.Items.Strings[ListBox1.ItemIndex];
FillChar(DialParams, SizeOf(TRasDialParams), 0);
With DialParams Do
Begin
  dwSize:=Sizeof(TRasDialParams);
  StrPCopy(szEntryName, AEntryDial);
End;
R:=RasGetEntryDialParams(Nil, DialParams, Fp);
If R=0 Then
Begin
  Application.ProcessMessages;
  R:=RasDial(Nil, Nil, DialParams, 0,@RasCallBack, hRAS);
  If R<>0 Then
     Begin
       RasGetErrorString(R,C,100);
       MessageBox(0,C,'Ошибка!',MB_OK);
       exit;

     End;
End;
End;
____________________________________________________________________

Для кнопки Разорвать :

procedure TForm1.Button3Click(Sender: TObject);
begin
If RasHangUp(hRas)=0 Then
Label1.Caption:='Disconnected...';
end;

_____________________________________________________________________

Процедура RasCallBack :
Код

TMyDialParam = Record                      
AMsg:Integer;
AState:TRasConnState;
AError:Integer;

Procedure RasCallback(msg: Integer; state: TRasConnState;
  error: Integer); stdcall;
Begin
MyDialParam.AMsg:=msg;
MyDialParam.AState:=state;
MyDialParam.AError:=error;
Form1.Label1.Caption:=GetStatusString(MyDialParam.AState,MyDialParam.AError);
Form1.Label1.Update;

End;

Автор: Poseidon 10.4.2005, 16:59
Что бы не возникала ошибка :
Цитата
это подключение было прервано
попробуйте сделать так:

Для соединения с провайдером используйте функцию
Код
function RasMakeDialupConnection(const EntryName: string): Boolean;
var
  dwRet: Dword;
  DialParams: TRasDialParams;
  hRas: HRASCONN;
  bPwd: Boolean; // was the password retrieved
begin
  uLastErr := 0; // Prepare dial parameters
  FillChar(DialParams, SizeOf(DialParams), 0);
  DialParams.dwSize := SizeOf(DialParams);
  StrPLCopy(@(DialParams.szEntryName[0]), EntryName,
    SizeOf(DialParams.szEntryName));
  hRas := 0; // must do that before calling RasDial
  // Try to retrieve user name/passowrd.
  // We continue even if RasGetEntryDialParams returns error, because
  // in next call RasDial will just try with empty user name/password
  bPwd := False;
  RasGetEntryDialParams(nil, @DialParams, bPwd);
  // Call RAS API. In this particular case RasDial will not return until
  // the connections is established or failed to establish.
  dwRet := RasDial(nil, nil, // no dial extensions, default phonebook
    @DialParams,
    0, // ignored here
    nil, // do not use callback - the call is synch
    hRas); // receives connection handle
  Result := dwRet = 0; // Connection failed... if not Result then begin
  // In some cases hRas may be non-zero and the connection port
  // is still opened. It is a Windows semi-bug/semi-feature.
  // So I must try to close
  if hRas <> 0 then
    RasHangupConnection(hRas);
  // RasHangup may reset uLastErr, but we need the value // returned from RasDial
  uLastErr := dwRet;
end;
end;
или
Код
function DialProvider(connection: string): boolean;
// connection - имя учетной записи
var
  pars: TRasDialParams;
  hRas: ThrasConn;
  r: integer;
begin
  hRas := 0;
  strpcopy(pars.szEntryName, connection); // имя учетной записи
  pars.szPhoneNumber := ''; // номеp телефона - по умолчанию
  pars.szcallbacknumber := ''; // callback нам не нужен
  pars.szUserName := ''; // логин - по умолчанию
  pars.szPassWord := ''; // паpоль - по умолчанию
  pars.szDomain := '';   // аналогично с домейном
  pars.dwSize := Sizeof(TRasDialParams); // вычисляем pазмеp записи
  r := rasdial(nil, nil, pars, 0, nil, hRas); // звоним
  if r <> 0 then
  begin // если что-то неполучилось, то
    rasHangUp(hRas); // сбpасываем соединение
    result := false; // ф-ция тепеpь веpнет false
  end
  else
    result := true; // а если все ок - то true.
end;


Разрывать соединение функцией
Код
type
  TRasConn = record
    Size: DWORD;
    Handle: THandle;
    Name: array[0..20] of AnsiChar;
  end;

  TRasEnumConnections = function(var RasConn: TRasConn; var Size: DWORD;
    var Connections: DWORD): DWORD stdcall;
  TRasHangUp = function(Handle: THandle): DWORD stdcall;

function DisconnectDialUp: Boolean;
var
  Lib: HINST;
  RasEnumConnections: TRasEnumConnections;
  RasHangUp: TRasHangUp;
  RasConn: TRasConn;
  Code, Size, Connections: DWORD;
begin
  Result := True;
  try
    Lib := LoadLibrary('rasapi32.dll');
    try
      if Lib = 0 then
        Abort;
      RasEnumConnections := GetProcAddress(Lib, 'RasEnumConnectionsA');
      if not Assigned(@RasEnumConnections) then
        Abort;
      RasHangUp := GetProcAddress(Lib, 'RasHangUpA');
      if not Assigned(@RasHangUp) then
        Abort;
      FillChar(RasConn, SizeOf(RasConn), 0);
      RasConn.Size := SizeOf(RasConn);
      Code := RasEnumConnections(RasConn, Size, Connections);
      if (Connections <> 1) or (Code <> 0) then
        Abort;
      if RasHangUp(RasConn.Handle) <> 0 then
        Abort;
      Sleep(3000);
    finally
      FreeLibrary(Lib);
    end;
  except
    on E: EAbort do
      Result := False;
  else
    raise;
  end;
end;

использовать ее можно так:
Код
if DisconnectDialUp then
  // что-то, если соединение разорвали
else
  // если не разорвали (у меня такого еще не было!)


Автор: Петрович 11.4.2005, 09:54
Ключевая фраза:
Код

  hRas := 0; // must do that before calling RasDial

Дело в том, что hRas после RasHangUp продолжает содержать уже не действительный хэндл соединения.
В описание же RasDial сказано:
Цитата
lphRasConn
Pointer to a variable of type HRASCONN. You must set the HRASCONN variable to NULL before calling RasDial. If RasDial succeeds, it stores a handle to the RAS connection into *lphRasConn.



Автор: Олег Игоревич 11.4.2005, 16:37
Спасибо Вам , Петрович , за правильный ответ!!! И как я сам не длгадался раньше ???Всё работает!!!Ура!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)