Конференция "Сети" » RasEnumConnections и ошибка 632 [D7, WinXP]
 
  • Цукор5 (21.02.12 18:38) [0]
    Т.е. судя по всему неправильная структура. Есть у кого-нибудь рабочий пример  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
       { Private declarations }
     public
       { Public declarations }
     end;

    var
     Form1: TForm1;

    implementation

    {$R *.dfm}

    type
     HRASCONN = THandle;
     //

     TRasConnA = record
       dwSize       : DWORD;
       hrasconn     : HRASCONN;
       szEntryName  : packed array[0..RAS_MaxEntryName ] of AnsiChar;
       {$IFDEF WINVER_0x400_OR_GREATER}
       szDeviceType : packed array[0..RAS_MaxDeviceType ] of AnsiChar;
       szDeviceName : packed array[0..RAS_MaxDeviceName ] of AnsiChar;
       {$ENDIF}
       {$IFDEF WINVER_0x401_OR_GREATER}
       szPhonebook: packed array[0..MAX_PATH - 1] of AnsiChar;
       dwSubEntry: DWORD;
       {$ENDIF}
       {$IFDEF WINVER_0x500_OR_GREATER}
       guidEntry: TGUID;
       {$ENDIF}
     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.


  • Цукор5 (22.02.12 14:57) [1]
    Пересмотрел все исходники. В основном они начала 2000х. Не могу найти НИ ОДНОГО живого и рабочего примера.

    Выручайте...
  • Цукор5 (11.03.12 23:37) [2]
    up
  • FireMan_Alexey © (12.03.12 04:04) [3]
    Посмотри здесь
    http://delphiworld.narod.ru
  • Rouse_ © (12.03.12 10:52) [4]
    program RasEnum;

    {$APPTYPE CONSOLE}

    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.

  • Rouse_ © (12.03.12 11:04) [5]
    Но это только под семеркой собирал, под 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';



    после чего определять тип ОС и выбирать с какой именно структурой можно работать...
  • Цукор5 (12.03.12 16:26) [6]
    На Windows Server 2008 R2  все заработало по варианту [4].
    На WinXP никак не хочет (структуру, естественно, менял). Получаю cConnections = 0 на неправильной структуре (хотя соединения есть и тот же RasEnumEntries их видит) или  ошибку 632 (на правильной структуре).
  • Rouse_ © (12.03.12 17:03) [7]
    ХР это вот до сюда:

     TRasConnA = record
       dwSize       : DWORD;
       hrasconn     : HRASCONN;
       szEntryName  : packed array[0..RAS_MaxEntryName ] of AnsiChar;
       {$IFDEF WINVER_0x400_OR_GREATER}
       szDeviceType : packed array[0..RAS_MaxDeviceType ] of AnsiChar;
       szDeviceName : packed array[0..RAS_MaxDeviceName ] of AnsiChar;

  • Цукор5 (12.03.12 17:44) [8]
    Не, на самом деле код из [4] заработал и на ХР.
    Беда была в том, что cConnections > 0 только в том случаи, когда есть реальные соединения. Это моя ментальная ошибка...Я считал, что RasEnumConnections отображает ВСЕ соединения, а не реальные. Оказалось наоборот.

    Большое спасибо!
  • Цукор5 (12.03.12 18:19) [9]
    Наверное непонятно объяснил. Т.е. если есть соединение, но не активное, то RasEnumConnections его не отобразит. А если я нажал "Вызов" и подключился, то все путем.
  • Цукор5 (12.03.12 18:46) [10]
    2 Rouse_ ©

    А еще вопрос. А где найти человеческие структуры для RAS API? Где читать-то?
    Структура TRasDialParams из ф-ции RasGetEntryDialParams у меня тоже неправильная. Опять 632 ошибка (((
  • Rouse_ © (12.03.12 18:50) [11]

    > А еще вопрос. А где найти человеческие структуры для RAS
    > API? Где читать-то?

    MSDN вестимо, ну и оттуда ручками переводить...
 
Конференция "Сети" » RasEnumConnections и ошибка 632 [D7, WinXP]
Есть новые Нет новых   [134435   +16][b:0][p:0.003]