![]() |
|
|
![]()
|
|
| walruz |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Здравствуйте все
Помогите мне, пожалуйста, побороть такую проблему: 1. создал COM сервер и подключаюсь к нему с помощью клиента (CLSCTX_INPROC_SERVER) - нет проблем 2. пытаюсь тот же самый COM сервер запустить в отдельном от клиента потоке. Так называемый "суррогатный клиент". Для этого изменяю вызов на CLSCTX_LOCAL_SERVER и добавляю необходимые записи в реестр (такие как например DllSurrogate, записи для интерфесов и т.д.) Все перепробовал, но в результате получаю ошибку 0x800703e6 при вызове функции CoGetClassObject Если поменять CLSCTX_LOCAL_SERVER обратно на CLSCTX_INPROC_SERVER - все работает Попробовал вместо своего cpp-кода подставить код, полученный wizard'ом ATL (idl мой, а вот реализация класса - нет) - работает. Пожалуйста, подскажите, чего не хватает Заранее БОЛЬШОЕ спасибо!!! // Клиентский вызов /////////////////////// HRESULT hr; IClassFactory *pCF = NULL; IInteger *pObj = NULL; CoInitialize(NULL); hr = CoGetClassObject( CLSID_CoInteger, CLSCTX_LOCAL_SERVER, NULL, IID_IClassFactory, (void**)&pCF ); if( SUCCEEDED( hr ) ) { hr = pCF->CreateInstance( NULL, IID_IInteger, ( void ** )&pObj ); pCF->Release(); if( SUCCEEDED( hr ) ) { pObj->Release(); } } CoUninitialize(); // h-файл //////////////////////////////////////// class CoInteger : IInteger { int m_refCount; public: CoInteger(); ~CoInteger(); STDMETHODIMP QueryInterface(REFIID riid, void** pIFace); STDMETHODIMP_(DWORD)AddRef(); STDMETHODIMP_(DWORD)Release(); }; class CoIntegerFactory : public IClassFactory { public: CoIntegerFactory(); ~CoIntegerFactory(); STDMETHODIMP QueryInterface(REFIID riid, void** pIFace); STDMETHODIMP_(DWORD)AddRef(); STDMETHODIMP_(DWORD)Release(); STDMETHODIMP CreateInstance(LPUNKNOWN pUnk, REFIID riid, void** pIFace); STDMETHODIMP LockServer(BOOL fLock); private: ULONG m_refCount; }; // сpp-файл ///////////////////////////////////////////////////////////////////////// CoInteger::CoInteger() { m_refCount = 0; } CoInteger::~CoInteger() { } // IUnknown STDMETHODIMP CoInteger::QueryInterface(REFIID riid, void** pIFace) { // Which aspect of me do they want? if(riid == IID_IUnknown) { *pIFace = (IUnknown*)(IInteger*)this; } else if(riid == IID_IInteger) { *pIFace = (IInteger*)this; } else { *pIFace = NULL; return E_NOINTERFACE; } ((IUnknown*)(*pIFace))->AddRef(); return S_OK; } STDMETHODIMP_(DWORD) CoInteger::AddRef() { ++m_refCount; return m_refCount; } STDMETHODIMP_(DWORD) CoInteger::Release() { if(--m_refCount == 0) { delete this; return 0; } else return m_refCount; } // ICF CoIntegerFactory::CoIntegerFactory() { m_refCount = 0; } CoIntegerFactory::~CoIntegerFactory() { } // IUnknown STDMETHODIMP CoIntegerFactory::QueryInterface(REFIID riid, void** pIFace) { // Which aspect of me do they want? if(riid == IID_IUnknown) { *pIFace = (IUnknown*)this; } else if(riid == IID_IClassFactory) { *pIFace = (IClassFactory*)this; } if( *pIFace ) { ((IUnknown*)(*pIFace))->AddRef(); return S_OK; } *pIFace = NULL; return E_NOINTERFACE; } STDMETHODIMP_(DWORD) CoIntegerFactory::AddRef() { ++m_refCount; return m_refCount; } STDMETHODIMP_(DWORD) CoIntegerFactory::Release() { if(--m_refCount == 0) { delete this; return 0; } else return m_refCount; } STDMETHODIMP CoIntegerFactory::LockServer(BOOL fLock) { if(fLock) ++g_lockCount; else --g_lockCount; return S_OK; } STDMETHODIMP CoIntegerFactory::CreateInstance(LPUNKNOWN pUnkOuter, REFIID riid, void** ppv) { // We do not support aggregation in this class object. if(pUnkOuter != NULL) return CLASS_E_NOAGGREGATION; CoInteger* pIntegerObj = NULL; HRESULT hr; // Create the car. pIntegerObj = new CoInteger; // Ask car for an interface. hr = pIntegerObj -> QueryInterface(riid, ppv); // Problem? We must delete the memory we allocated. if (FAILED(hr)) delete pIntegerObj; return hr; // S_OK or E_NOINTERFACE. } |
|||
|
||||
| walruz |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 15 Регистрация: 28.7.2006 Репутация: нет Всего: нет |
Ребята, спасибо за внимание
Это случай из серии "убейсебяобстену" вот как было:
вот как нужно сделать, чтобы заработало:
|
||||
|
|||||
![]()
|
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |