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

Posted

技术标签:

【中文标题】_variant_t 范围指针的 C++ 文字自动化问题(AddPicture() 方法)【英文标题】:C++ Word Automation problem with _variant_t range pointer (AddPicture() method) 【发布时间】:2011-08-09 15:28:19 【问题描述】:

我的任务是遍历 word xml 模式中的字段并替换图片。这些图片是转换为图像的excel图表。遍历模式中的字段也没有问题,也可以删除找到的图像。我的问题是在原始范围内重新插入内联形状。我将找到的内联形状的范围保存在单独的 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) 替换最后一个参数作为范围,我会得到一个类型不匹配的编译错误。我不明白为什么 COM 接口中现在有用于范围指针的 _variant_t 构造函数。也许有?

另一种选择是通过 TOP 和 LEFT 属性读取图片的绝对坐标,并在没有范围的情况下插入它。但是这个解决方案会很不优雅,而且有点蹩脚。

非常感谢任何帮助!

提前致谢!

克里斯

【问题讨论】:

【参考方案1】:

您不能从_com_ptr_t&lt;T&gt;(在您的情况下,T = Word::Range)构造_variant_t,只能从IUnknown*IDispatch* 构造。

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

&_variant_t( isRangePtr.GetInterfacePtr() )

【讨论】:

以上是关于_variant_t 范围指针的 C++ 文字自动化问题(AddPicture() 方法)的主要内容,如果未能解决你的问题,请参考以下文章

如何将自定义结构传递给 C++(非 CLI)中的 _variant_t?

_variant_t的使用

_variant_t和_bstr_t

CComVariant 与 _variant_t、CComBSTR 与 _bstr_t

_bstr_t和_variant_t是怎样定义的

在 C++ 中是不是可以强制执行字符串文字函数参数?