Обработка событий MSOffice, IDispEventSimpleImpl
От: BorysB  
Дата: 19.03.05 12:42
Оценка:
Здравствуйте. Я сейчас пишу Addin для MSWord. Мне необходимо реализовать запрет печати. Я использую IDispEventSimpleImpl интерфейс. Наследуюсь от него таким образом:

public IDispEventSimpleImpl<1,CAddin, &__uuidof(MSWord::ApplicationEvents2)>


С помощью OLE/COM Object Viewer нахожу ApplicationEvents2 и нужный мне метод DocumentBeforePrint:

[id(0x00000007), helpcontext(0x00061a86)]
void DocumentBeforePrint(
[in] Document* Doc,
[in] VARIANT_BOOL* Cancel);

Заполняю структуру:
_ATL_FUNC_INFO DocumentBeforePrintInfo = {CC_STDCALL, VT_EMPTY, 2, {VT_DISPATCH|VT_BYREF, VT_BOOL|VT_BYREF}};


Ф-я обработчик выглядит так:

void __stdcall CAddin::DocumentBeforePrint(IDispatch* /*_Document**/ Doc, VARIANT_BOOL *Cancel)
{        
USES_CONVERSION;
    
    _Document* myDoc = (_Document*)Doc;
    HRESULT hr = m_spApp->get_ActiveDocument(&myDoc);
    
    BSTR bstr;
    myDoc->get_Name(&bstr);
        
    CComBSTR b_string = bstr;
    MessageBox(NULL, W2T(b_string), W2T(b_string), MB_OK);
    
    VARIANT_BOOL *myCancel = new VARIANT_BOOL(VARIANT_TRUE);
        
    Cancel = myCancel;
    MessageBox(NULL, "Document is going to be printed", "Message", MB_OK);
}


Дело в том, что все работает, только VARIANT_BOOL *Cancel игнорируется. Я пытался записывать структуру так:

_ATL_FUNC_INFO DocumentBeforePrintInfo = {CC_STDCALL, VT_EMPTY, 2, {VT_DISPATCH, VT_BOOL}};

Пока не могу найти решения. Где-то прочитал, что подобная проблема была при использовании .NET, но она, как пишет Microsoft, исправлена в Офисе 2003. У меня .Net установлен, но этот проект я пишу на VC++6.
Может у кого-то были подобные проблемы. Подскажите что делать.
И еще, как правильно заполнять _ATL_FUNC_INFO, в часности, когда указывать VT_BYREF в зависимости от [in] [out]. Я видел несколько примеров и везде по-разному, у меня ПОКА работает и так, и так.



19.03.05 17:57: Перенесено модератором из 'C/C++. Прикладные вопросы' — Odi$$ey
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.