Для доступа к СОМ-объекту необходимо задать его идентификатор, который объявляется следующим образом:

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;


⇐ Предыдущая| |Следующая ⇒