Re[4]: Обработка событий MSOffice, IDispEventSimpleImpl
От: BorysB  
Дата: 21.03.05 12:13
Оценка:
Здравствуйте, Elena_, Вы писали:

E_>Насколько я понимаю, таким кодом

E_>
BB>>void __stdcall CAddin::DocumentBeforePrint(IDispatch* /*_Document**/ Doc, VARIANT_BOOL *Cancel)
BB>>{        
BB>>    VARIANT_BOOL *myCancel = new VARIANT_BOOL(VARIANT_TRUE);
BB>>    Cancel = myCancel;
BB>>}
E_>

E_>Вы вообще ничего не передаете для вызывающей программы, кроме того выделяете память, которая не будет освобождена, так что в любом случае вряд ли этот код подходит

Почему таким образом я ничего не передаю? Я эту кашу понимаю следующим образом:
Ворд, судя по всему, — вызывает мою функцию. Я используюю _ATL_FUNC_INFO DocumentBeforePrintInfo = {CC_STDCALL... т.е. stdcall CallingConvention. Следовательно Ворд должен чистить память (The callee cleans the stack. This is the default convention for calling unmanaged functions with platform invoke. MSDN).
Если все правильно то параметры должны передаваться по ссылке:

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


Но я не уверен. И вообще я не могу четко понять относительно кого по ссылке. Моя функция выполняет роль call-back функции и вызывается вместо соответствующей функции этого интерфейса.

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

Тогда параметры должны передаваться мне,..по ссылке?........? Почти ничего не понимаю.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.