![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Разрыв соединения с инетом
@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);
И обязательно анализировать результат выполнения ф-ции.