#import "с:\\Windows\system32\opcenum.exe" \
rename_namespace OPCENUM
using namespace OPCENUM;
Путь к OPCEnum может отличаться для различных рабочих станций.
Теперь добавим в класс COPCClientDlg объявление функции
private:
int ShowRegisteredServers();
Функция будет добавлять в список установленные ОРС сервера и
возвращать их общее количество.
int COPCHDAClientDlg::ShowRegisteredServers()
{
CLSID clsid; // индентификатор ОРСEnum
CLSID clsidcat; //идентифификатор категории ОРС DA серверов
HRESULT hRes;
// Идентификатор категории ОРС HDA 1.2
hRes=CLSIDFromString(L"{58E13251-AC87-11D1-84D5-
00608CB8A7E9}",&clsidcat);
// Идентификатор компонента просмотра списка серверов
hRes=CLSIDFromProgID(L"OPC.ServerList",&clsid);
//Идентификатор интерфейса IOPCServerList
IID IID_IOPCServerList=__uuidof(IOPCServerList);
IOPCServerList *pServerList;
// запрос интерфейса у компонента должен вернуть S_OK
hRes=CoCreateInstance(clsid,NULL,CLSCTX_LOCAL_SERVER,
IID_IOPCServerList,(void**)&pServerList);
//перечислитель, в котором будут храниться GUID серверов
IEnumGUID * pIOPCEnumGuid;
//запрос серверов спецификации OPC HDA 1.2
pServerList->EnumClassesOfCategories(1, &clsidcat,0,
NULL,&pIOPCEnumGuid);
OLECHAR *pszProgID; // буфер для записи ProgID серверов
OLECHAR *pszUserType; // буфер для записи описания серверов
LVITEM lvItem; // подготовка элемента списка для вставки
ZeroMemory(&lvItem,sizeof(lvItem));
lvItem.cchTextMax=100;
lvItem.mask=LVIF_TEXT;
GUID guid; // Сюда будет записывать идентификатор текущего сервера
int nServerCnt=0; // общее количество доступных серверов
unsigned long iRetSvr; // количество серверов, предоставленных
запросом
// получение первого доступного идентификатора сервера
pIOPCEnumGuid->Next(1,&guid,&iRetSvr);