DOUBLE M - MemSize.dblVal; //Размер памяти возвращается вещественным числом, if (FAILED(hr)) *Ram--l:

else *Ram = int((M+1.0)/1024); //Переписали вещественное M в целое Ram. SysFreeString(Mem); //Освободили занятую строкой память. pShell->Release(): //Приводит к уничтожению объекта и удалению Shell.dll из //памяти, если его интерфейсы не были затребованы другим приложением, return 0; }

Стоит подробнее рассмотреть действия, выполняемые функцией:

1. Функция CoCreateInstance() получает идентификатор miaccaclsid и идентификатор интерфейса I IDJShel 1 Di spatch2. При помощи параметра CLSCTX_INPR0C указывается, что СОМ-сервер находится в DLL-библиотеке, а не в ЕХЕ-файле.

2. CoCreatelnstanceC) во время своего выполнения вызывает еще одну функцию CoGetClassObject(rclsid, dwClsContext, NULL, IIDJClassFactory, &pCF) и передает ей GUID класса clsid, контекст исполнения CLSCTX_INPROC и GUID-идентифи-катор I ID_IC1 assFactory фабрики классов, которая реализуется в виде особого класса в любом СОМ-сервере.

3. Функция CoGetClassObjectO увидит по контексту CLSCTX_INPROC, переданному параметром dwClsContext, что объект реализован внутри DLL-библиотеки и хранится на этом же компьютере. Идентификатор rcl si d позволит ей просмотреть реестр, найти папку с библиотекой Shell.dll и загрузить ее в память стандартной системной функцией LoadLibrary(). Далее при помощи функции GetProcAdress() получается указатель на экспортируемую любым СОМ-серве-ром функцию Dl IGetCl assObject(). После этого можно вызвать данную функцию для создания объекта и получения интерфейса.

4. Функция Dl IGetCl assObject () создает не объект clsid, а фабрику классов в любом СОМ-сервере. Фабрика классов возвращает в CoCreateInstance() указатель pCF интерфейса 11D_IС1 assFactory.

5. Функция CoCreateInstance(), получив этот указатель, вызовет метод фабрики классов Createlnstance(), и уже метод Createlnstance() возвратит программе-клиенту требуемый указатель Shel 1.

6. Функция Dl IGetCl assObject () создает объект MylnfoFactory и не уничтожает его. Чтобы уничтожить созданную фабрику классов, CoCreateInstance() вызовет ReleaseO для интерфейса IC1 assFactory.


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