Для каждого класса в компоненте требуется специальный класс – фабрика класса, в обязанности которого включается создание нового экземпляра класса. Фабрика обязательно поддерживает IClassFactory (интерфейс).
interface IClassFactory
{
HRESULT __stdcall CreateInstance (IUnknown* pUnkOuter, REFIID riid, void** ppobj);
HRESULT __stdcall LockServer (BOOL fLock);
};
Методы интерфейса IClassFactory:
1) CreateInstance( ) – создает новый экземпляр класса и запрашивает у него необходимый интерфейс
2) LockServer( ) – позволяет заблокировать / разблокировать класс в памяти, предотвращая его уничтожение.
Пример:
При реализации компонента внутри процесса компонент разбивается на несколько файлов. Например:
1. RectIface.h – объявление интерфейсов и констант GUID (GUID – реализация UUID корпорацией Microsoft; UUID – 128-битовое число, однозначно идентифицирующее объект во времени и пространстве).
2. RectCls.h – реализация класса Rect и его фабрики
3. RectSrv.h – реализация DLL.
Каждый компонент внутри процесса должен экспортировать функцию
STDAPI DllGetClassObject (REFCLSID rclsid, REFIID riid, LPVOID* ppv) – запрашивает у библиотеки заданную фабрику класса (rclsid). Запрашивает заданный интерфейс фабрики (riid). Возвращает в последнем параметре указатель на IClassFactory.