Re[7]: Add-in в Ворде 2000 работает, а в Ворде97 нет!!!!
От: globus  
Дата: 22.10.04 12:44
Оценка:
Здравствуйте, Dmitriy Yakovlev, спасибо Вам за предыдущий пост (оценку поставил ).

Наткнулся еще на одну граблю. Для 97 офиса файл excel8.tli содержит вропер диспинтерфейса, тогда как msword8.tli и msppt8.tli — дуал интерфейса. Теперь в коде метода Init (где добавляются менюшки)

MSEXCEL::_ApplicationPtr spExcelApp(Application);
Office::CommandBarsPtr spBars = spExcelApp->GetCommandBars();
Office::CommandBarPtr spMenuBar = spBars->GetActiveMenuBar();


вот в этом фрагменте, при выполнении последней строки выскакикает GPF:


Run-Time Check Failure #0 - The value of ESP was not properly saved across a function call.
This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention.


Теперь смотрю в Watch на spBars. Иерархия вложенности интерфейсов такова:

+ spBars
+ m_pInterface
+ Office::_IMsoDispObj
+ IDispatch
+ IUnknown

Заметьте Office::_IMsoDispObj, у всех других (например, из неймспейса Office) Office::_IMsoDispObj нету — m_pInterface сразу наследуется от IDispatch. но впринципе, проблемы в этом не вижу.

Теперь к импорт директиве дописую no_dual_interfaces:

#import <MSO97.DLL> rename_namespace("Office"), rename("RGB","MsoRGB"), rename("DocumentProperties", "MsoDocumentProperties"), named_guids, no_dual_interfaces

Теперь в excel8.tli и в mso97.tli — реализация через диспинтерфейс и код

MSEXCEL::_ApplicationPtr spExcelApp(Application);
Office::CommandBarsPtr spBars = spExcelApp->GetCommandBars();
Office::CommandBarPtr spMenuBar = spBars->GetActiveMenuBar();


работает.

Вижу что надо чтобы и в Office и в MSEXCEL была реализация либо через виртуальную таблицу (как в случае с вордом и поверпоинтом), либо же через диспинтерфейс.

В МСДН в атрибутах директивы import нашел как отключить диспинтерфейс (no_dual_interfaces), но как задать его нету. Может он установлен по умолчанию, но почему тода для екселя реализация через диспинтерфейс?

Отсюда вижу один выход, задать всем в #import атрибут no_dual_interfaces. Но это ж тормозить будет по сравнению с виртуальной таблицей.

В итоге парочка к Вам вопросов, Dmitriy Yakovlev. Посмотрите на Ваш вропер(файл excel8.tli), Ваша реализация случайно не через диспинтерфейс?

У меня начинается:

#pragma implementation_key(1)
inline IDispatchPtr MSEXCEL::Adjustments::GetApplication ( ) {
    IDispatch * _result = 0;
    _com_dispatch_method(this, 0x60020000, DISPATCH_PROPERTYGET, VT_DISPATCH, (void*)&_result, NULL);
    return IDispatchPtr(_result, false);
}


И все остальное в том же духе — через вызов _com_dispatch_method. У Вас также? Если да то как У вас тогда работает, если mso97.tli ведь через виртуальную таблицу?

Я возможно не очень доступно выражаю свои вопросы, и может кое-что не коректно, так как с СОМ-ом я осторожно и "на Вы" но думаю, что моя проблема Вам понятна.

Заранее благодарен!!!
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.