Re[2]: DllGetClassObject
От: Аноним  
Дата: 07.08.02 15:51
Оценка:
Здравствуйте 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, еще пару СО и библиотеку типов; хотя я не уверен в том, что он использует эти объекты СОМ. К сожалению, реализация сервера не доступна, также, как и его разработчики. Вопрос — Есть ли еще какие-либо методы работы с незарегистрированными объектами СОМ.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.