C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Мониторинг локальной сети, Какие API функции существуют в WindowsXP
Light
  Отправлено: 16.08.2004, 13:45


Не зарегистрирован







Есть пpоблема: Есть локальная сеть и нyжно опpеделить кто подключён в данный момент к сети. Использyя для этого API фyнкции в WindowsXP. Бyдy очень благодаpен за помощь, ссылки и ссылки на толковyю литеpатypy.
Doga
Отправлено: 16.08.2004, 14:48


Мастер участка

Группа: Участник
Сообщений: 575



Толковая литература конечно есть! biggrin.gif Называется MSDN. Толковой она была всегда, таковой является сейчас, и, надеюсь, будет такой же в будующем! smile.gif

Посмотрите там описание интерфейса IShellFolder.


Вот кусочек сода для начала:

CODE


LPMALLOC FpShellMalloc;
//Инициализация локальных и сетевых дисков
   bool FHResult = CoInitializeEx(NULL, /*COINIT_MULTITHREADED*/COINIT_APARTMENTTHREADED );
   if (SUCCEEDED(FHResult))
   {
     try
     {
       FHResult = SHGetMalloc(&FpShellMalloc);
       if (SUCCEEDED(FHResult))
       {
         try
         {
           IShellFolder *DesktopFolder = NULL;
           FHResult = SHGetDesktopFolder(&DesktopFolder);
           if (SUCCEEDED(FHResult))
           {
             try
             {
               TItemIDList  *TmpPIDL = NULL;
               IShellFolder *TmpShellFolder = NULL;
               STRRET       StrRetValue;
         
               
               //Локальные диски
               FHResult = SHGetSpecialFolderLocation(NULL, CSIDL_DRIVES, &TmpPIDL);
               if (SUCCEEDED(FHResult))
               {
                 FHResult = DesktopFolder->BindToObject(TmpPIDL, NULL, IID_IShellFolder, (LPVOID*)&TmpShellFolder);
                 if (SUCCEEDED(FHResult))
                 {
                   FHResult = DesktopFolder->GetDisplayNameOf(TmpPIDL, SHGDN_INFOLDER, &StrRetValue);
                   if (SUCCEEDED(FHResult))
                   {
                     //Имя объекта
                     char * TmpDisplayName = GetDisplayName(TmpPIDL, StrRetValue);

                     //Иконки объекта  
                     int IconIndex;

                     TIcon *Icon = new TIcon();
                     
                     //Обнакновенная  и открытая тож
                     Icon->Handle     = (void *)GetShellImage(TmpPIDL, false);
                     IconIndex = FHolderImages->AddIcon(Icon);
                     Icon->ReleaseHandle();
                     delete Icon;


                     TmpNode = FHolderTreeView->Items->Add(NULL, AnsiString(TmpDisplayName));

                     TmpNode->ImageIndex = IconIndex;
                     TmpNode->SelectedIndex = IconIndex;
                     TmpNode->Data = new TNodeData();
                     ((TNodeData *)TmpNode->Data)->Init(true, ntLocalDrive, "", "", this, TmpPIDL, TmpPIDL, TmpShellFolder);
                     TmpNode->HasChildren = true;

                     free(reinterpret_cast<void *>(TmpDisplayName));
                   }
                 }
               }

               //Сеть
               FHResult = SHGetSpecialFolderLocation(NULL, CSIDL_NETWORK, &TmpPIDL);
               if (SUCCEEDED(FHResult))
               {
                 FHResult = DesktopFolder->BindToObject(TmpPIDL, NULL, IID_IShellFolder, (LPVOID*)&TmpShellFolder);
                 if (SUCCEEDED(FHResult))
                 {
                   FHResult = DesktopFolder->GetDisplayNameOf(TmpPIDL, SHGDN_INFOLDER, &StrRetValue);
                   if (SUCCEEDED(FHResult))
                   {
                     //Имя объекта
                     char * TmpDisplayName = GetDisplayName(TmpPIDL, StrRetValue);

                     //Иконки объекта  
                     int IconIndex;

                     TIcon *Icon = new TIcon();
                     
                     //Обнакновенная и открытая тож
                     Icon->Handle     = (void *)GetShellImage(TmpPIDL, false);
                     IconIndex = FHolderImages->AddIcon(Icon);
                     Icon->ReleaseHandle();
                     delete Icon;

                     TmpNode = FHolderTreeView->Items->Add(NULL, AnsiString(TmpDisplayName));

                     TmpNode->ImageIndex = IconIndex;
                     TmpNode->SelectedIndex = IconIndex;
                     TmpNode->Data = new TNodeData();
                     ((TNodeData *)TmpNode->Data)->Init(true, ntNetDrive, "", "", this, TmpPIDL, TmpPIDL, TmpShellFolder);
                     TmpNode->HasChildren = true;

                     free(reinterpret_cast<void *>(TmpDisplayName));
                   }
                 }
               }
             }
             __finally
             {
               if (DesktopFolder)
               {
                 DesktopFolder->Release();
               }
             }
           }  
         }
         catch(...)
         {
           if (FpShellMalloc)
           {  
             FpShellMalloc->Release();
           }
           FpShellMalloc = NULL;
         }
       }  
     }
     catch(...)
     {
       CoUninitialize();
     }
   }



Этот код инициализирует корнвые узлы класса TTreeView (FHolderTreeView) и добавляет для них системные иконки Windows в TImageList *FHolderImages.

Если есть проблема с английским загляните сюда (есть прмеры на С/C++ и Delphi):
http://www.akzhan.midi.ru/devcorner/articl...-Namespace.html


Так же в BCB6 в каталоге .\Examples\ShellControls лежат исходники компонета bcbshlctrls.bpk.


Для начала, думаю, хватит... biggrin.gif

Вернуться в Вопросы программирования в C++Builder