Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как победить ошибку 0x800703e6, Неверная попытка доступа к адресу памяти 
:(
    Опции темы
walruz
Дата 14.9.2006, 17:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



Здравствуйте все smile

Помогите мне, пожалуйста, побороть такую проблему:
1. создал COM сервер и подключаюсь к нему с помощью клиента (CLSCTX_INPROC_SERVER) - нет проблем
2. пытаюсь тот же самый COM  сервер запустить в отдельном от клиента потоке. Так называемый "суррогатный клиент".
Для этого изменяю вызов на CLSCTX_LOCAL_SERVER и добавляю необходимые записи в реестр (такие как например DllSurrogate, записи для интерфесов и т.д.)
Все перепробовал, но в результате получаю  ошибку 0x800703e6 при вызове функции CoGetClassObject

Если поменять CLSCTX_LOCAL_SERVER обратно на CLSCTX_INPROC_SERVER - все работает

Попробовал вместо своего cpp-кода подставить код, полученный wizard'ом ATL (idl мой, а вот реализация класса - нет) - работает.

Пожалуйста, подскажите, чего не хватает smile

Заранее БОЛЬШОЕ спасибо!!!

// Клиентский вызов
///////////////////////
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.
    
}
PM MAIL   Вверх
walruz
Дата 15.9.2006, 11:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 15
Регистрация: 28.7.2006

Репутация: нет
Всего: нет



Ребята, спасибо за внимание smile

Это случай из серии "убейсебяобстену"

вот как было:
Код

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 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;
    }
    else
    {
        *pIFace = NULL;
        return E_NOINTERFACE;
    }

    ((IUnknown*)(*pIFace))->AddRef();
    return S_OK;
}

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0533 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.