Здравствуйте, 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 ведь через виртуальную таблицу?
Я возможно не очень доступно выражаю свои вопросы, и может кое-что не коректно, так как с СОМ-ом я осторожно и "на Вы"

но думаю, что моя проблема Вам понятна.
Заранее благодарен!!!