XloperとVariantの間でマーシャルをするにはどうすればよいですか? [閉まっている
-
12-10-2019 - |
質問
私はcomオブジェクトと通信するExcelプラグイン(xll)に取り組んでいます。だから、私はXloperとVariantの間のマーシャルをしなければなりません。私はこの作業のほとんどを持っていますが、アレイは間違いなく痛みです。 1つのアレイと2Dアレイをサポートする必要があります。
誰かがすでにこれに対処しなければならなかったと思います。 Variant、Safearray、Xloper(およびXloper12)への取引を簡素化する最良の方法は何ですか?
解決
私はこれのために自分のマーシャリングコードをハンドロールする必要がありました。これを処理するための自由に利用できるLibはありませんでした。 XLWは、プラグイン全体をラッピングするためのものです。これは私にとって選択肢ではありませんでした。
最終的に、XloperとVariantのドキュメントを調べて、それらをお互いにマッピングする方法を見つけて、多くの時間がかかりました。
好奇心の強い人のために:
Xloperの配列(12):
- .xltypeはxltypemultiです
- .val.Arrayは、Xlopersの配列へのポインターです。
バリアントの配列:
- .vtはvt_array |ですVT_Variant
- .Parrayはバリエーションの安全です
このマーシャリングに関する他のヒント:
- xltyperefおよびxltypesref:xlcoerceを使用して、実際のセル値を調べます。
- 整数値はオーバーフローのリスクを実行します。
boost::numeric_cast
それを助けます。 - ストリングマーシャリングは迷惑です。 XloperはCharを使用し、Xloper12はWCHARを使用し、バリアントはBSTRを使用します。
- 新しいXloper文字列に割り当てるバッファを解放することを忘れないでください。それに応じて、xlbitdllfreeとxlautofree(12)を使用します。
- テンプレートプログラミングは、Xloper/Xloper12の問題に役立ちます。ブーストが役立ちます。 _BSTR_Tも役立ちます。
他のヒント
XLL Plus(コスト)を使用していますhttp://www.as-ltd.co.uk/xllplus/default.htm
XLW(OpenSource)もありますhttp://xlw.sourceforge.net/
そして、おそらく私は気づいていない他の人でしょう
所属していません StackOverflow