_variant_t范围指针的C ++ Word自动化问题(AddPicture()方法)

时间:2011-08-09 15:28:19

标签: c++ automation ms-word

我的任务是遍历单词xml架构中的字段并替换图片。这些图片是转换为图像的excel图表。迭代模式中的字段也没有问题,删除找到的图像。我的问题是在原始范围重新插入inlineshapes。我在单独的WordRangePointer中保存找到的inlines形状的范围,但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 );

如果我用&amp; _variant_t(isRangePtr)替换最后一个参数作为范围,我得到一个类型不匹配编译错误。我不知道为什么COM接口中的范围指针现在有_variant_t构造函数。也许有?

另一个选项可能是通过TOP和LEFT属性读取图片的绝对坐标,并插入没有范围的图片。但是这种解决方案不够优雅且有点糟糕。

我真的很感激任何帮助!

提前致谢!

克里斯

1 个答案:

答案 0 :(得分:0)

您无法从_variant_t(其中 T = Word :: Range )构建_com_ptr_t<T>,只能来自IUnknown*或{{1 }}

您唯一的选择是显式访问C指针:

IDispatch*