Здравствуйте, уважаемые форумчане. Изучая статью о перехвате 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++. Прикладные вопросы' — Кодт