-
Т.е. судя по всему неправильная структура. Есть у кого-нибудь рабочий пример RasEnumConnections на ОС XP и выше? Мой нерабочий код:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
const RAS_MaxEntryName = 256;
RAS_MaxDeviceType = 16;
RAS_MaxDeviceName = 128;
RASAPI = 'rasapi32.dll';
type
TForm1 = class(TForm)
Button1: TButton;
Memo1: TMemo;
procedure Button1Click(Sender: TObject);
private
public
end;
var
Form1: TForm1;
implementation
type
HRASCONN = THandle;
TRasConnA = record
dwSize : DWORD;
hrasconn : HRASCONN;
szEntryName : packed array[0..RAS_MaxEntryName ] of AnsiChar;
szDeviceType : packed array[0..RAS_MaxDeviceType ] of AnsiChar;
szDeviceName : packed array[0..RAS_MaxDeviceName ] of AnsiChar;
szPhonebook: packed array[0..MAX_PATH - 1] of AnsiChar;
dwSubEntry: DWORD;
guidEntry: TGUID;
end;
TRasConn = TRasConnA;
PRasConn = ^TRasConnA;
function RasEnumConnections(RasConnArray: PRasConn; var lpcb: LongInt; var lpcConnections: Longint): Longint; stdcall;
external RASAPI name 'RasEnumConnectionsA';
procedure TForm1.Button1Click(Sender: TObject);
var uNumber : LongInt;
uSize : LongInt;
dwRet : DWord;
RasConns : array[0..15] of TRasConn;
begin
uSize:= SizeOf(RasConns);
FillChar(RasConns,uSize,0);
RasConns[0].dwSize:=SizeOf(TRasConn);
dwRet := RasEnumConnections(@RasConns[0], uSize, uNumber);
if dwRet = 0 then
Memo1.Lines.Add('Count RAS:'+IntToStr(uNumber)) else
Memo1.Lines.Add('Error RasEnumConnections. Code:#'+IntToStr(dwRet));
end;
end.
-
Пересмотрел все исходники. В основном они начала 2000х. Не могу найти НИ ОДНОГО живого и рабочего примера. Выручайте...
-
up
-
-
program RasEnum;
uses
Windows,
SysUtils;
const
RAS_MaxDeviceType = 16;
RAS_MaxDeviceName = 128;
RAS_MaxEntryName = 256;
type
HRASCon = THandle;
PRASCONNA = ^TRasConnA;
TRasConnA = record
dwSize : DWORD;
hrasconn : HRasCon;
szEntryName : array [0..RAS_MaxEntryName] of AnsiChar;
szDeviceType : array [0..RAS_MaxDeviceType] of AnsiChar;
szDeviceName : array [0..RAS_MaxDeviceName] of AnsiChar;
szPhonebook : array [0..MAX_PATH - 1] of AnsiChar;
dwSubEntry : DWORD;
end;
function RasEnumConnectionsA(lpRasconn: PRASConnA;
lpcb, lpcConnections: PDWORD): DWORD; stdcall; external 'rasapi32.dll';
var
Connections: array [0..255] of TRasConnA;
cb, cConnections, dwError: DWORD;
begin
cb := Length(Connections) * SizeOf(TRasConnA);
Connections[0].dwSize := SizeOf(TRasConnA);
dwError := RasEnumConnectionsA(@Connections[0], @cb, @cConnections);
if dwError = NO_ERROR then
Writeln('RAS count: ', cConnections)
else
Writeln('RasEnumConnectionsA error: (', dwError, '). ', SysErrorMessage(dwError));
Readln;
end.
-
Но это только под семеркой собирал, под 2000 структуру скорее нужно будет усекать, т.е. лучше обьявить 3 типа структуры: TRasConnADefault = record
dwSize : DWORD;
hrasconn : HRasCon;
szEntryName : array [0..RAS_MaxEntryName] of AnsiChar;
szDeviceType : array [0..RAS_MaxDeviceType] of AnsiChar;
end;
TRasConnA400 = record
dwSize : DWORD;
hrasconn : HRasCon;
szEntryName : array [0..RAS_MaxEntryName] of AnsiChar;
szDeviceType : array [0..RAS_MaxDeviceType] of AnsiChar;
szDeviceType : array [0..RAS_MaxDeviceType] of AnsiChar;
szDeviceName : array [0..RAS_MaxDeviceName] of AnsiChar;
end;
TRasConnA401 = record
dwSize : DWORD;
hrasconn : HRasCon;
szEntryName : array [0..RAS_MaxEntryName] of AnsiChar;
szDeviceType : array [0..RAS_MaxDeviceType] of AnsiChar;
szDeviceName : array [0..RAS_MaxDeviceName] of AnsiChar;
szPhonebook : array [0..MAX_PATH - 1] of AnsiChar;
dwSubEntry : DWORD;
end;
function RasEnumConnectionsA(lpRasconn: Pointer;
lpcb, lpcConnections: PDWORD): DWORD; stdcall; external 'rasapi32.dll'; после чего определять тип ОС и выбирать с какой именно структурой можно работать...
-
На Windows Server 2008 R2 все заработало по варианту [4]. На WinXP никак не хочет (структуру, естественно, менял). Получаю cConnections = 0 на неправильной структуре (хотя соединения есть и тот же RasEnumEntries их видит) или ошибку 632 (на правильной структуре).
-
ХР это вот до сюда: TRasConnA = record
dwSize : DWORD;
hrasconn : HRASCONN;
szEntryName : packed array[0..RAS_MaxEntryName ] of AnsiChar;
szDeviceType : packed array[0..RAS_MaxDeviceType ] of AnsiChar;
szDeviceName : packed array[0..RAS_MaxDeviceName ] of AnsiChar;
-
Не, на самом деле код из [4] заработал и на ХР. Беда была в том, что cConnections > 0 только в том случаи, когда есть реальные соединения. Это моя ментальная ошибка...Я считал, что RasEnumConnections отображает ВСЕ соединения, а не реальные. Оказалось наоборот.
Большое спасибо!
-
Наверное непонятно объяснил. Т.е. если есть соединение, но не активное, то RasEnumConnections его не отобразит. А если я нажал "Вызов" и подключился, то все путем.
-
2 Rouse_ ©
А еще вопрос. А где найти человеческие структуры для RAS API? Где читать-то? Структура TRasDialParams из ф-ции RasGetEntryDialParams у меня тоже неправильная. Опять 632 ошибка (((
-
> А еще вопрос. А где найти человеческие структуры для RAS > API? Где читать-то?
MSDN вестимо, ну и оттуда ручками переводить...
|