Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Вопрос по RAS-соединению, Как начать коннект повторно? 
:(
    Опции темы
Олег_Игоревич
  Дата 8.4.2005, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 21.1.2005

Репутация: нет
Всего: нет



Доброго Вам времени суток!
Я вызываю функцию RASDIAL для тогот чтобы дозвониться до провайдера. Во время коннекта
вызываю RashangUp для разъединения соединения. При попытке дозвониться до провайдера повторно возникает ошибка:это подключение было прервано (использую функцию RasCallBack в качестве параметра в функции RasDial - R:=RasDial(Nil, Nil, DialParams, 0,@RasCallBack, hRAS);).
Очень хочу узнать как дозвониться до провайдера повторно без возникновения этой ошибки!!!
Заранее спасибо!!! smile smile
--------------------
Используй жизнь ПО ПОЛНОЙ !!!  
PM MAIL   Вверх
Poseidon
Дата 9.4.2005, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 4
Всего: 133



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


--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Олег_Игоревич
Дата 9.4.2005, 18:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 21.1.2005

Репутация: нет
Всего: нет



Для кнопки "Дозвониться" следующий код:

Код

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;


Это сообщение отредактировал(а) p0s0l - 10.4.2005, 14:43
--------------------
Используй жизнь ПО ПОЛНОЙ !!!  
PM MAIL   Вверх
Poseidon
Дата 10.4.2005, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Delphi developer
****


Профиль
Группа: Комодератор
Сообщений: 5273
Регистрация: 4.2.2005
Где: Гомель, Беларусь

Репутация: 4
Всего: 133



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

Для соединения с провайдером используйте функцию
Код
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
  // если не разорвали (у меня такого еще не было!)




--------------------
Если хочешь, что бы что-то работало - используй написанное, 
если хочешь что-то понять - пиши сам...
PM MAIL ICQ   Вверх
Петрович
Дата 11.4.2005, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1000
Регистрация: 2.12.2003
Где: Москва

Репутация: 1
Всего: 55



Ключевая фраза:
Код

  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.





--------------------
Все знать невозможно, но хочется
PM ICQ   Вверх
Олег Игоревич
Дата 11.4.2005, 16:37 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо Вам , Петрович , за правильный ответ!!! И как я сам не длгадался раньше ???Всё работает!!!Ура!!!
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0826 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.