Здравствуйте. Я сейчас пишу 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