Здравствуйте Vi2, Вы писали:
Vi2>А в чём проблема?
Vi2>В каждой DLL есть 4 дополнительных, связанных с СОМ входа. Один из них — DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID* ppv). Передаёшь туда CLSID кокласса и IID_IClassFactory, получаешь класс-фактори, у неё просишь CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, void** ppvObj) с IID_IDispatch. Маршаллинга тебе не треба, раз DLL. Что ещё нужно, чтобы "встретить достойную старость"?
Возможно,я не совсем корректно описал заморочку.
А проблема вот в чем. Метод с DllGetClassObject работает, если сия библиотека уже зарегистрирована. А иначе — следующий кусок кода
HRESULT hr;
HINSTANCE hDll=::LoadLibrary("ordam20.dll");
DWORD dw=GetLastError();
HRESULT (STDAPICALLTYPE *pfnGetCo)(REFCLSID rclsid, REFIID riid, LPVOID* ppv);
(FARPROC&) pfnGetCo=::GetProcAddress(hDll,"DllGetClassObject");
IClassFactory *piCf=NULL;
hr=pfnGetCo(CLSID_ORAsyncConnection,IID_IClassFactory,(void**)&piCf);
LPDISPATCH lpDisp=NULL;
hr=piCf->CreateInstance(NULL,IID_IORAsyncConnection,(void**)&lpDisp);
/* class Client_IORAsyncConnection : public COleDispatchDriver
{
...
long GetTimeout();
...
};*/
Client_IORAsyncConnection iAConn(lpDisp);
long l=iAConn.GetTimeout(); // throw COleException {m_sc=0x8002801D(библиотека не зарегистрирована)}
сваливается в COleException с SCODE 0x8002801D(библиотека не зарегистрирована). Возможно, это связано с реализацией собственно сервера — он регистрирует, помимо компонента с CLSID_ORAsyncConnection, еще пару СО и библиотеку типов; хотя я не уверен в том, что он использует эти объекты СОМ. К сожалению, реализация сервера не доступна, также, как и его разработчики. Вопрос — Есть ли еще какие-либо методы работы с незарегистрированными объектами СОМ.