Image

Imageratibor_vv wrote in Imageru_cpp

Приветствую, коллеги!

Дано: из Qt-приложения (4.1.4) работаю с Wordом, невидимым или в собственном окне Wordа -- здесь всё элементарно.

Нужно: для вордовского документа, который уже обёрнут в QAxObject, создать также обёртку в QAxWidget -- чтобы отобразить документ в окне моего приложения. Как?

Теперь это же, но подробно.

Создаю интерфейс к MSWord:

QAxObject *word = new QAxObject( "Word.Application" );

Получаю интерфейсы к его подобъекту "коллекция открытых документов":

QAxObject *docs = word->querySubObject( "Documents()" );

Создаю новый документ:

QAxObject *docAsIface = docs->querySubObject( "New()" );

до этих пор всё работает превосходно. Нужно теперь как-то на основе docAsIface построить виджет. У класса QAxWidget есть конструктор, у которого единственный параметр -- указатель на COM-интерфейс. А у класса QAxObject есть метод queryInterface, который позволяет получить любой интерфейс COM-объекта. Я пытаюсь сделать так:

IUnknown *unk = NULL;
docAsIface->queryInterface( XXXXXXX, (void**) &unk ); // здесь самое главное!
QAxWidget *docAsWidget = new QAxWidget( unk );

Основной вопрос: какой же интерфейс запрашивать у документа, чтобы из этого интерфейса можно было построить виджет?

Т.е. какой IID подставлять вместо XXXXXXX?

Попутно. Кто-нибудь из коллег делал класс виджета для вордовского документа? Я-то свой написал, но меня не покидает ощущение, что кто-то мог это реализовать гораздо изящнее.

Попутно 2. На тролльтеховском форуме кто-то говорил, что вордовский документ вообще не следует пытаться делать  ActiveX-controlом, с вордо якобы можно работать только как с COM-объектом :-(

С другой стороны, следующий код у меня работает:
QAxWidget *docAsWidget = new QAxWidget( "Word.Document" );
docAsWidget->show();