none
WORD Shapes.AddPolyline() の SafeArrayOfPoints が渡せません RRS feed

  • 質問

  • Visual Studio2005にて、C#でWORDドキュメントを自動生成し、折れ線などを描くプログラムを作成しています。

    一本線は描けました。

    折れ線を描く場合に、

    Shapes.AddPolyline(ref object SafeArrayOfPoints,ref object Anchor)

    メソッドを呼び出しています。

    このSafeArrayOfPoints の作成の仕方が判りません。

     

    float[,] ar = new float[8,2];

    for (int i = 0; i < 8; ++i){

      ar[i,0] = 100 + 20*i;

      ar[i,1] = 100 + 50*(i%2);

    }

    object var = new System.Runtime.InteropServices.VariantWrapper(ar);

    oDoc.Shapes.AddPolyline(ref var, ref oMissing);

     

    このコードでは、次の例外が発生してしまいます。

    System.ArgumentException

    VariantWrappers cannot be stored in Variants.

     

    よろしく、お願いします。

    ひまでうす
    2007年10月16日 21:09

すべての返信

  • VariantWrapper を噛ませずに、単に、object var = ar; で通りませんか?


    2007年10月30日 7:03
  •  

    通りました。そして、実行もできました。

    object 渡しの場合、どんな中身でも、コンパイルが通ってしまうものなんですね。

    ランタイムエラーの内容も漠然としたものが多いです。

     

    今回の場合、中国語のフォーラムでC++のサンプルがありましたが、C#のサンプルは見つかりませんでした。

    SafeArray などでも検索したのですが。

     

    ありがとうございました。

    2007年11月2日 21:53
  • 引数が object である以上、コンパイル時にチェックできないのは仕方ないでしょうね。
    実際に中身の妥当性をチェックできるのは、どうしても実行時となります。

    確かに、COM 相互運用で発生する例外はあまり叙述的ではありませんが、
    呼び出し側が引数等を適切に用意することが前提となっているので、
    CLR が型の不一致を検出するのにはどうしても限界があるようです。

    Word や Excel 等、VBScript で扱えるように考慮された COM コンポーネントは、
    引数や戻り値の型が VARIANT ばかりで構成されてたりするので、
    実行時に型の不一致でトラブルが発生することは非常に多いと思います。

    複雑な COM 相互運用になると、マーシャリングの規則を知らないと原因究明が大変です……。

    今回は、object の中身が float[] だったため、マーシャリング(型の変換)が実行時に行われ
    float の SafeArray(VB における Single 配列)を格納した VARIANT として引き渡されたというわけですね。

    2007年11月3日 10:09