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
|
Толковая литература конечно есть! Называется MSDN. Толковой она была всегда, таковой является сейчас, и, надеюсь, будет такой же в будующем!
Посмотрите там описание интерфейса 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.
Для начала, думаю, хватит...
|
|
|