2011-08-09 24 views
1

私の仕事は、単語xmlスキーマのフィールドを繰り返して、画像を置き換えることです。それらの画像は、画像に変換されたExcelチャートです。スキーマ内のフィールドを反復することは、見つかったイメージを削除することにも問題ありません。私の問題は、元の範囲でインラインシェイプを再挿入することです。私は別々のWordRangePointerで見つけられたinlineshapeの範囲を保存していますが、AddPicture()とAddOLEObject()はバリアントを予期しています。 & vtMissingを挿入するだけでドキュメントに画像(またはOLEオブジェクト)を配置することができましたが、イメージは自動的に挿入され、必要な場所には挿入されません。_variant_t範囲ポインタ(AddPicture()メソッド)のC++ Wordオートメーションの問題

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)との最後の引数を交換した場合range私は型の不一致のコンパイルエラーを取得します。私は今なぜCOMインターフェイスの範囲ポインタの_variant_tコンストラクタがあるのではありません。多分そこはありますか?

もう一つの選択肢は、TOPとLEFTプロパティを通して画像の絶対座標を読み取り、範囲なしで挿入することです。しかし、この解決法は、控えめで、なんらかの愚かなものになるでしょう。

本当に助けていただきありがとうございます。

ありがとうございます!

クリス

答えて

0

あなただけIUnknown*またはIDispatch*から、(あなたのケースでどこT =ワード::レンジ_com_ptr_t<T>から_variant_tを構築することはできません。

&_variant_t(isRangePtr.GetInterfacePtr()) 

あなたの唯一のオプションは、明示的にCのポインタにアクセスすることです