Использование динамической библиотеки - Isolator¶
Библиотека предназначена для использования различных COM объектов без регистрации их в реестре. При этом COM объекты реализуются в вызывающем Isolator.dll приложении.
Реализация¶
Библиотека Isolator[d].dll строится в составе солюшена DIGISPOT.sln и сохраняется в каталог EXE.
Isolator.dll не реализует никаких функций, а лишь перенаправляет вызовы обратно вызывающей стороне.
Isolator перенаправляет следующие функции:
DllCanUnloadNow
DllGetClassObject
DllRegisterServer
DllUnregisterServer
DllInstall
Для того, чтобы перечисленные функции могли перенаправлять вызов, необходимо инициализировать коллбэки (callback) при загрузке библиотеки библиотеки.
Сущестуют следующие функции для инициализации коллбэков:
InitCanUnloadNow
InitGetClassObject
InitRegisterServer
InitUnregisterServer
InitInstall
Для работы инициализируйте требуемые вызовы.
Пример использования¶
Пример:
1. Реализуйте функцию для обратного вызова:
STDAPI GetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv)
{
if(riid != IID_IUnknown && riid != IID_IClassFactory)
return E_NOINTERFACE;
Factory* factory = new Factory();
if (!factory)
return E_OUTOFMEMORY;
HRESULT hr = factory->QueryInterface(riid, ppv);
if (FAILED (hr))
{
delete factory;
factory = NULL;
}
return NOERROR;
}
Функция должна создавать фабрику классов, в которой будет происходить создание вашего COM компонента.
2. Загрузите библиотеку Isolator.dll:
HMODULE IsolatorModule = CoLoadLibrary(L"Isolator.dll", FALSE);
DWORD addr = (DWORD)GetProcAddress(IsolatorModule, "InitGetClassObject");
if(addr){
*((DWORD*)&InitGetClassObject) = addr;
InitGetClassObject(local::GetClassObject); }
3. Добавление записи о COM объекте в манифест.
Внесите изменения в манифест библиотеки Isolator.dll, добавьте строку:
, где clsid - идентификатор созданного Вами COM объекта.