Для доступа к СОМ-объекту необходимо задать его идентификатор, который объявляется следующим образом:
CLSID clsid
Вместо типа GUID обычно указывается идентификатор класса. Но поскольку программисту неудобно запоминать длинную последовательность шестнадцате-ричных чисел, он может не объявлять константу cl sid, а получить ее значение из реестра по программному имени:
char *szProgID - "Shell.Application";
Строки реестра хранятся в UNICODE, поэтому при таком объявлении потребуется выделить также место для этого же имени в 16-битной кодировке: WCHAR szWideProgID[128]: В листинге 23.2 приведен текст функции int GetSystemlnfoOnt *Ram), которая выполняет преобразование программного имени объекта в UNICODE и осуществляет поиск при помощи функции CLSIDFromProgID( ) GUID объекта по его программному имени. Помимо этого загружается СОМ-сервер, создается соответствующий объект и заполняется указатель на интерфейс. Также производится вызов функции интерфейса, возвращающей объем памяти параметром *Ram, и когда интерфейс больше не нужен, он освобождается.
Листинг 23.2
int GetSystemlnfoUnt *Freq.int *Ram) //Модуль utils.cpp {
long ILen - MultiByteToWideChar (CP_ACP.O.
szProgID.strlen(szProgID).szWideProgID.sizeof(szWideProgID)); szWideProgID[lLen]«'\0';
HRESULT hr - CLSIDFromProgID( szWideProglD. Äclsid): //Получение GUID if (FAILED(hr)) {
MessageBox(0."Shell.Application". "Класс в реестре не найден",0);
return -1;
}
hr-CoCreateInstance(clsid. //Поиск и загрузка библиотеки Shell.dll. NULL. //Для неагрегированных объектов здесь NULL. CLSCTXJNPROC. //Сервер грузится из DLL
продолжение &
Применение библиотеки DirectX
Листинг 23.2 (продолжение)
IID_IShellDispatch2. //Идентификатор требуемого интерфейса. (LPVOID*)&pShell); // Результат работы - указатель на этот интерфейс, if (FAILED(hr)) {return -1;}
VARIANT MemSize: //Переменная для размещения результата. BSTR Mem - SysAl "1 ocString(L"PhysicalMemoryInstal 1 ed"): //Преобразование в BSTR hr - pShell->GetSystemInformation(Mem,&MemSize); //Запрос размера памяти, unsigned short vt=MemSize.vt;