Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Разрыв соединения с инетом


@ac ©   (2004-02-01 07:51:00) 

Разрыв соединения с инетом

Делаю так:

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;
Size, Connections: DWORD;
begin
Result:=True;
Lib:=LoadLibrary('rasapi32.dll');
try
  RasEnumConnections := GetProcAddress(Lib, 'RasEnumConnectionsA');
  RasHangUp := GetProcAddress(Lib, 'RasHangUpA');
  FillChar(RasConn, SizeOf(RasConn), 0);
  RasConn.Size := SizeOf(RasConn);
  RasEnumConnections(RasConn, Size, Connections);
  RasHangUp(RasConn.Handle);
  Sleep(3000);  
finally
  FreeLibrary(Lib);
end;
end;


Не разрывает.
RasEnumConnections выдает попеременно то 0 (т.е. функция сработала), то 8 (неизвестно что).
Но даже если выдает 0, то все равно RasConn, Size, Connections остаются пустыми.

В чем проблема?
(саму функцию DisconnectDialUp я естественно в программе вызвать не забываю :))


lipskiy   (2004-02-08 02:13:00) [1]

Вот это работает:

procedure TForm1.Button1Click(Sender: TObject);
var
Lib: HINST;
RasHangUp: TRasHangUp;
i:integer;
begin
try
Lib:=LoadLibrary('rasapi32.dll');
try
RasHangUp := GetProcAddress(Lib, 'RasHangUpA');
for i:= 1 to 20000 do RasHangUp(i);
finally
FreeLibrary(Lib);
end;
except
end;
end;


Dimka Maslov   (2004-02-06 09:03:00) [2]

ShowMessage(SysErrorMessage(GetLastError)) Напишет тебе причину ошибки


Verg   (2004-02-05 08:34:00) [3]

Ты это читал?


> Verg ©   (01.02.04 11:25) [1]


@ac   (2004-02-05 08:06:00) [4]

"анализировать результат выполнения ф-ции"
это так что ли:

var
res:integer;

res:=RasEnumConnections(RasConn, Size, Connections);
case res of
    0:begin
       ShowMessage('Все Ok!');
      end;
    1:begin
       ...
      end;  
    ...
    else ShowMessage('не все Ok!')
end;

Так все равно RasConn, Size, Connections не меняются. А в чем смысл анализа?
А вообще, я сделал все предельно просто, старым добрым ламерским способом - перебором:

  for i:=1 to 20000 do RasHangUp(i);

Неэлегантно.


Digitman   (2004-02-02 09:25:00) [5]


> @ac   (02.02.04 08:02) [3]


> Что с XP делать?


ему про фому, он все про ерему)

тебе же сказали :

> обязательно анализировать результат выполнения ф-ции


!!


@ac   (2004-02-02 08:02:00) [6]

Выяснилось, что пример работает только в Win9x
Что с XP делать?


@ac   (2004-02-02 07:53:00) [7]

Я пробовал изменять размер буфера. Проверял - 32 байта выделяет. Потом даже пробовал добавлять лишнюю сотню байт.
Очевидно проблема в другом.


Verg   (2004-02-01 11:25:00) [8]


> RasEnumConnections(RasConn, Size, Connections);


Параметр Size на входе должен содержать размер буфера.
Если этого размера ф-ции будет недостаточно, то в эту переменную ф-ция запишет необходимй размер, а сама вернет ошибку ERROR_BUFFER_TOO_SMALL или ERROR_NOT_ENOUGH_MEMORY.
Т.о., перед ее вызовом необходимо сделать:
Size := sizeof(RasConn);

И обязательно анализировать результат выполнения ф-ции.


Наверх

Титульная страница Поиск, карта сайта Написать письмо