Итак, объект 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 объекта.