Хочется написать приложение, которое не требовало бы инсталяции: принёс его на flash drive, поработал, унёс с собой.
Проблема в том, что имеются уже готовые COM библиотеки, написанные на ATL, которые надо в этом приложении использовать.
Хочется сделать так, чтобы CoCreateInstance(), будучи вызванной в этом процессе, как-то знала об этих DLL и не искала CLSID и прочее в системном реестре.
На худой конец можно модифицировать клиента так, чтобы он сам загружал DLL и возвращал ссылки на интерфейсы объектов.
Есть ли в windows поддержка создания COM объектов без предварительной регистрации сервера в реестре?
Здравствуйте, WhiningHal, Вы писали:
вот так:
HMODULE hDll = CoLoadLibrary(<lib name>);
m_fpDllGetClassObject = (DLLGETCLASSOBJECT)GetProcAddress(hDll, "DllGetClassObject");
CComPtr<IClassFactory> pCf;
CLSID clsid;
CLSIDFromString(L"{guid of the class}", &clsid);
m_fpDllGetClassObject(clsid, IID_ClassFactory, (LPVOID*)&pCf);
pCf->CreateInstance(...);
...
Здравствуйте, Максим Алексейкин, Вы писали:
МА>Здравствуйте, WhiningHal, Вы писали:
МА>вот так:
МА>МА> HMODULE hDll = CoLoadLibrary(<lib name>);
МА> m_fpDllGetClassObject = (DLLGETCLASSOBJECT)GetProcAddress(hDll, "DllGetClassObject");
МА> CComPtr<IClassFactory> pCf;
МА> CLSID clsid;
МА> CLSIDFromString(L"{guid of the class}", &clsid);
МА> m_fpDllGetClassObject(clsid, IID_ClassFactory, (LPVOID*)&pCf);
pCf->>CreateInstance(...);
МА> ...
МА>
Можно пойти немного дальше и зарегистрировать объект. Тогда не потребуется переделка клиента. Судя по MSDN, он получит корректные ссылки на объекты.
CoRegisterClassObject(clsid, pCf, CLSCTX_INPROC_SERVER, REGCLS_SINGLEUSE, &SomeGlobalVariable);
С параметрами я недопонял: REGCLS_SINGLEUSE означает, что фабрика доступна одному процессу, или что она исчезнет из области видимости после первого вызова CoGetClassObject() для этого класса?