Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Delphi и PPTP


Автор: hooster 30.12.2009, 17:51
Здравствуйте.
У меня есть задача получить список созданных VPN соединений (т.е. все которые есть в Сетевых Подключениях)
Покопался в сети, понял что нужно использовать RAS.
По идее все что мне нужно должен выдавать код:
Код

var
  EntryCount, BufSize: longint;       //LBRASName: TListBox;
  Result: LongInt;
  Entryes: lpRasEntryName;
  i: integer;
begin
//  Осуществляем поиск настроенных соединений и заполняем ими список.
  Result := ERROR_SUCCESS;
  Entryes := nil;
  EntryCount := 0;
  bufsize := 0;
  try
    LBRASName.Items.BeginUpdate;
    LBRASName.Items.Clear;

//Проводим поиск сохранённых соединений
    // Определяем размер буфера
    GetMem(Entryes, SizeOf(TRASEntryName));
    FillChar(Entryes^, SizeOf(TRASEntryName), 0);
    Entryes^.dwSize := SizeOf(TRASEntryName);
    Result := RasEnumEntries(nil, nil, Entryes, BufSize, EntryCount);
    if Result = ERROR_BUFFER_TOO_SMALL then
    begin
      FillChar(Entryes^, SizeOf(TRASEntryName), 0);
      FreeMem(Entryes, SizeOf(TRASEntryName));

      //Выделяем необходимую память
      GetMem(Entryes, SizeOf(TRASEntryName)*EntryCount);
      if Entryes <> nil then
      begin
        //первая структура RASEntryName должна содержать размер всей структуры
        FillChar(Entryes^, SizeOf(TRASEntryName)*EntryCount, 0);
        Entryes^.dwSize := SizeOf(TRASEntryName);

        //Получаем список соединений
        Result := RasEnumEntries(nil, nil, Entryes, bufSize, EntryCount);
        if Result = ERROR_SUCCESS then
        begin
          // Данные успешно полученны
          for i := 0 to EntryCount-1 do
          begin
            LBRASName.Items.Add(Entryes^.szEntryName);
            Inc(Entryes);
          end;
        end;
        Dec(Entryes, EntryCount);

        FillChar(Entryes^, SizeOf(TRASEntryName)*EntryCount, 0);
        FreeMem(Entryes, SizeOf(TRASEntryName)*EntryCount);
      end
      else
        ShowMessage('Не получилось выделить память');
    end;
  finally
    LBRASName.Items.EndUpdate;
  end;

Так вот тут после первой строки 
Код

Result := RasEnumEntries(nil, nil, Entryes, BufSize, EntryCount);

 получаю ошибку с номером 0, вместо 603 BUFFER TO SMALL. 
Кто с таким сталкивался подскажите где копать.

Автор: ~FoX~ 31.12.2009, 15:27
hooster, Много мороки как то... Есть же пространство имен оболочки 

Код

uses ShlObj, ShellAPI, ActiveX;

//.........................
var
   pShell, ShellFolder: IShellFolder;
   pidl: PITEMIDLIST;
   PMalloc: IMalloc;
   sName: string;
   EnumIDList: IEnumIDList;
   pceltFetched: ULONG;
   lpName: TStrRet;
   slDirectories: TStringList;

 begin
   slDirectories := TStringList.Create;
   try
     SHGetDesktopFolder(ShellFolder);
     SHGetSpecialFolderLocation(0, CSIDL_CONNECTIONS, pidl);
     SHGetMalloc(PMalloc);
     ShellFolder.BindToObject(pidl, nil, IID_IShellFolder, Pointer(pShell));
     pShell.EnumObjects(0, SHCONTF_NONFOLDERS or SHCONTF_FOLDERS, EnumIDList);
     while EnumIDList.Next(1,pidl, pceltFetched) = S_ok do begin
       pceltFetched := 0;
       lpName.uType := 0;
       pShell.GetDisplayNameOf(pidl, SHGDN_INCLUDE_NONFILESYS, lpName);
       sName := lpName.pOleStr;
       slDirectories.Add(sName);
     end;
     Memo1.Lines.Assign(sldirectories);
   finally
     pMalloc._Release;
     pMalloc := nil;
     slDirectories.Free;
   end;
end;

Автор: hooster 1.1.2010, 21:18
Попробовал, таким образом я получаю список всех соединений, а интересует именно только соединения  ВПН, как я тут их тип то определю?

Автор: developer2007 9.1.2010, 14:37
~FoX~, 
хороший пример, а таким способом можно управлять подключениями?

Автор: ~FoX~ 10.1.2010, 15:11
developer2007, Нет, но в известной степени ты можешь сделать с ними все что и с другими объектами файловой системы...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)