Не получается создать перехватчик COM
От: Vistix Россия  
Дата: 23.03.09 17:24
Оценка:
Здравствуйте, уважаемые форумчане. Изучая статью о перехвате COM, я наткнулся на проблему, которую не могу решить и никто не может мне помочь.


#include "stdafx.h"
#include "atlbase.h"
#include "callobj.h"
#include "atlcom.h"
#include "atltrace.h"

#define _MSWORDOLB_PATH "C:\Program Files\Microsoft Office\OFFICE12\MSWORD.OLB"
#import _MSWORDOLB_PATH rename("ExitWindows", "WordExitWindows") rename("FindText", "WordFindText") raw_interfaces_only

template<class T>
class CallHandler : public CComObjectRoot, 
    public ICallFrameEvents
{
public:
    BEGIN_COM_MAP(CallHandler)
        COM_INTERFACE_ENTRY(ICallFrameEvents)
    END_COM_MAP()

    void init(CComPtr<T> spItf)
    {
        m_spItf = spItf;
    }

    STDMETHOD(OnCall)(ICallFrame* pFrame)
    {
        LPWSTR itf, method;
        HRESULT hr = pFrame->GetNames(&itf, &method);
        hr = pFrame->Invoke(m_spItf.p);
        ATLTRACE("call %s::%s %8x\n", itf, method, hr);
        CoTaskMemFree(itf);
        CoTaskMemFree(method);
        return hr;
    }

private:
    CComPtr<T> m_spItf;
};

int _tmain(int argc, _TCHAR* argv[])
{
    ::CoInitialize(0);
    HRESULT hr = CoInitializeSecurity(NULL, -1, NULL, NULL, RPC_C_AUTHN_LEVEL_DEFAULT, RPC_C_IMP_LEVEL_IMPERSONATE,
        NULL, EOAC_NONE, NULL);

    using namespace Word;
    CComPtr<ICallInterceptor> spInt;

    hr = CoGetInterceptor(__uuidof(Word::_Application), 0, __uuidof(ICallInterceptor),
        reinterpret_cast<void**>(&spInt));

    CComObject<CallHandler<Word::_Application>>* pHandler = 0;
    CComObject<CallHandler<Word::_Application>>::CreateInstance(&pHandler);
    hr = spInt->RegisterSink(pHandler);

    _ApplicationPtr p_WordApp(L"Word.Application");
    hr = spInt.QueryInterface(&p_WordApp);
    p_WordApp->put_Visible(true);
    p_WordApp->Activate();
    getchar();
    return 0;
}

Извините, что много кода выложил. Проблема возникает при попытке создать объект CComObject<CallHandler<Word::_Application>>
Пишет, что access violation. Вероятно я неправильно что-то делаю. Помогите, пожалуйста.
Заранее благодарю!

25.03.09 13:32: Перенесено модератором из 'C/C++. Прикладные вопросы' — Кодт
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.