C ++ Word Automation проблема с указателем диапазона _variant_t (метод AddPicture ()) - PullRequest
1 голос
/ 09 августа 2011

Моя задача - перебирать поля в схеме xml слова и заменять картинки.Эти картинки представляют собой диаграммы Excel, преобразованные в изображения.Перебирая поля в схеме, нет проблем, удаляя найденные изображения.Моя проблема состоит в том, чтобы заново вставить линейные формы в исходном диапазоне.Я сохраняю диапазон найденной inlineshape в отдельном WordRangePointer, но AddPicture () и AddOLEObject () ожидают варианта.Только вставив & vtMissing, мне удалось поместить изображение (или объект OLE) в документ, но поэтому изображения вставляются автоматически, а не туда, куда я хочу.

MSDN InlineShapes.AddOLEObject ()

MSDN InlineShapes.AddPicture ()

часть моего кода выглядит следующим образом (если InlineShapes найден):

_variant_t vtTrue( true );
_variant_t vtFalse( false );
_variant_t vtTypeS( "Excel.Sheet.8" );
_variant_t vtTypeC( "Excel.Chart.8" );

Word::InlineShapesPtr ishps = spDoc->InlineShapes;
Word::InlineShapePtr is = field->InlineShape;
Word::RangePtr isRangePtr;


Word::DocumentsPtr spDocs = spWordApp->Documents;
Word::_DocumentPtr spDoc = spDocs->Open(&_variant_t( filename ));

if ( is && ( std::string( is->OLEFormat->ProgID ).find("Excel.Sheet.8") != std::string::npos ) )
        {
            std::cout << "Excel Sheet found" << std::endl;
            height = (int)is->Height;
            width = (int)is->Width;
            isRangePtr= is->Range;
            std::pair< long, long > range = std::make_pair( isRangePtr->Start, isRangePtr->End );

            //Word::RangePtr r = field->Result;
            is->Delete();

            //sFullName = "//absolute path.......jpg" ;

            // Now AddOleObject
            //ishps->AddPicture( sFullName , &vtTrue, &vtTrue,  &vtMissing );

            sFullName = "//absolute path.......jpg" ;
            is = ishps->AddPicture( sFullName , &vtTrue, &vtTrue, &vtMissing );

            //is->Range->SetRange( range.first, range.second );
            //ishps->AddOLEObject(&vtTypeS ,  &_variant_t( sFullName ), &vtTrue, &vtFalse, &vtMissing, &vtMissing, &vtMissing,  &vtMissing );

Если я заменю последний аргумент & _variant_t (isRangePtr) для диапазона, я получу ошибку компиляции несоответствия типов.Я не знаю, почему теперь есть конструктор _variant_t для указателей диапазона в интерфейсе COM.Может быть, есть?

Другим вариантом может быть чтение абсолютных координат изображения через свойства TOP и LEFT и вставка его без диапазона.Но это решение было бы не элегантным и отчасти дерьмовым.

Буду очень признателен за любую помощь!

Заранее спасибо!

Крис

1 Ответ

0 голосов
/ 28 октября 2013

Вы не можете построить _variant_t из _com_ptr_t<T> (где T = Word :: Range в вашем случае), только из IUnknown* или IDispatch*.

Ваш единственный вариант - получить явный доступ к указателю C:

&_variant_t( isRangePtr.GetInterfacePtr() )
...