3

COM オブジェクトと通信する Excel プラグイン (XLL) に取り組んでいます。そのため、XLOPER と VARIANT の間でマーシャリングを行う必要があります。私はこれのほとんどを機能させましたが、配列は間違いなく苦痛です。1 次元配列と 2 次元配列をサポートする必要があります。

誰かがすでにこれに対処しなければならなかったと思います。VARIANT、SAFEARRAY、および XLOPER (および XLOPER12) の処理を​​簡素化する最善の方法は何ですか?

4

2 に答える 2

3

これには、独自のマーシャリング コードを手作業で作成する必要がありました。これを処理するための自由に利用できるライブラリはありませんでした。XLW は、プラグイン全体をラップするためのものです。これは私にとっては選択肢ではありませんでした。

結局、xloper とバリアントのドキュメントを調べて、それらを相互にマップする方法を理解するのに、多くの時間がかかりました。

好奇心旺盛な人のために:

xloper(12) の配列:

  • .xltype は xltypeMulti です
  • .val.array は、xlopers の配列へのポインターです。

バリアントの配列:

  • .vt は VT_ARRAY | VT_VARIANT
  • .parray はバリアントの SafeArray です

このマーシャリングに関するその他のヒント:

  • xltypeRef および xltypeSRef: xlCoerce を使用して実際のセル値を検索します。
  • 整数値はオーバーフローの危険があります。 boost::numeric_castそれを助けます。
  • 文字列のマーシャリングは面倒です。xloper は char を使用し、xloper12 は wchar を使用し、バリアントは bstr を使用します。
  • 新しい xloper 文字列用に割り当てたバッファーを解放することを忘れないでください。それに応じて、xlbitDLLFree と xlAutoFree(12) を使用してください。
  • テンプレート プログラミングは、xloper/xloper12 の問題に役立ちます。ブーストが役立ちます。_bstr_t も役立ちます。
于 2011-02-23T22:47:22.137 に答える
0

私は XLL Plus を使用しています (費用) http://www.as-ltd.co.uk/xllplus/default.htm

XLW (オープンソース) もあります http://xlw.sourceforge.net/

そしておそらく私が気づいていない他の人

于 2010-12-23T08:47:46.697 に答える