Шаг 22 - Минимальный набор действий для использования COM

Итак, объект COM можно поместить в DLL или EXE, мы с Вами поместим его в DLL. Итак в минимальном виде нам нужен проект DLL, в котором должны быть реализованы две функции:

DllGetClassObject    
DllCanUnloadNow      
Эти имена функций не просто придуманы. Они входят в понятие COM API есть набор функций, которые позволяют использовать COM. Например, DllGetClassObject извлекает объект, то есть дает к нему доступ. Набор функций связанных с COM называют библиотекой COM.

В самом DLL необходимо реализовать классы, которые наследуют необходимые интерфейсы и их реализуют. О некоторых из них я рассказал в предыдущих шагах. Для примера вот такой

class  MathClassFactory  :  public  IClassFactory
{
protected:
    long        m_lRef;
public:    
	MathClassFactory();    
	~MathClassFactory();
	//  IUnknown
	STDMETHOD(  QueryInterface(REFIID,  void**  ));
	STDMETHOD_(ULONG,  AddRef());    
	STDMETHOD_(ULONG,  Release());
	//  IClassFactory
	STDMETHOD(CreateInstance)(LPUNKNOWN,  REFIID,  void**);
	STDMETHOD(LockServer)(BOOL);
};

Так необходимо зарегистрировать компонент. Это можно сделать в простом случае с использованием REG файла. Например такого:

REGEDIT
HKEY_CLASSES_ROOT\Chapter2.Math.1       = Chapter2 Math Component
HKEY_CLASSES_ROOT\Chapter2.Math.1\CLSID = {A888F560-58E4-11d0-A68A-0000837E3100}
HKEY_CLASSES_ROOT\Chapter2.Math         = Chapter2 Math Component
HKEY_CLASSES_ROOT\Chapter2.Math\CurVer  = Chapter2.Math.1
HKEY_CLASSES_ROOT\Chapter2.Math\CLSID   = {A888F560-58E4-11d0-A68A-0000837E3100}
HKEY_CLASSES_ROOT\CLSID\{A888F560-58E4-11d0-A68A-0000837E3100} =  Chapter2 Math Component
HKEY_CLASSES_ROOT\CLSID\{A888F560-58E4-11d0-A68A-0000837E3100}\ProgID = Chapter2.Math.1
HKEY_CLASSES_ROOT\CLSID\{A888F560-58E4-11d0-A68A-0000837E3100}\VersionIndependentProgID = Chapter2.Math
HKEY_CLASSES_ROOT\CLSID\{A888F560-58E4-11d0-A68A-0000837E3100}\InprocServer32 = D:\PROJECT\server\Debug\server.dll

Вот теперь объект COM в минимальной реализации готов. Для его использования нужен клиент. Клиент будет пользоваться функциями.

CLSIDFromProgID
CoGetClassObject

Вот так. Давайте еще раз сформулируем.

Класс с наследованием и реализацитей интерфейсов IUnknown, ICLassFactory etc ....
Правильно оформленный DLL с функцией DllGetClassObject 
Регистрация компонента  с использованием реестра и REG файла

Если всё это есть, то на C++ мы сможем реализовать клиента COM объекта.


Предыдущий Шаг | Следующий Шаг | Оглавление
Автор Каев Артем.