COM オブジェクトを使用しようとしていますが、パラメーター タイプ VARIANT* に問題があります。COM オブジェクトの関数は、この型のパラメーターを持っている場合を除いて、問題なく使用できます。
generateDocumentation によって生成されるドキュメントは次のとおりです。
QVariantList パラメータ = ...
object->dynamicCall("GetRanges(int,int,int&, QVariant&)", params);
COM オブジェクトで提供されるドキュメントによると、パラメーターは LONG、LONG、LONG*、および VARIANT* 型である必要があり、VARIANT* は BSTR の配列を含む VARIANT へのポインターであることが正確です。
通常、3 番目と 4 番目のパラメーター (LONG* および VARIANT* 型) を取得できるはずですが、それらの値は関数によって使用されません。
これが私のコードです( a と b は以前に初期化された int です):
QStringList sl;
QVariantList params;
int i = -1;
params << QVariant (a);
params << QVariant (b);
params << QVariant (i);
params << QVariant (sl);
comobject->dynamicCall("GetRanges(int,int,int&,QVariant&)",params);
sl = params[3].toStringList();
i = param[2].toInt();
そのコードでは、 QAxBase: Error calling IDispatch member GetRanges: Unknown errorというエラーだけが表示されますが、これはあまり役に立ちません。
私はいくつかのことを変更しようとしましたが、このコードを使用して(一種の)進行することができました:
QStringList sl;
QVariant v = qVariantFromValue(sl);
QVariantList params;
int i = -1;
params << QVariant (a);
params << QVariant (b);
params << QVariant (i);
params << qVariantFromValue((void*)&v);
comobject->dynamicCall("GetRanges(int,int,int&,QVariant&)",params);
sl = params[3].toStringList();
i = param[2].toInt();
エラーは解消され、最後に i の値は正しいのですが、sl はまだ空のままです。正しく動作する C# のサンプル デモがあるので、そうすべきではないことはわかっています。
誰かがそれを機能させる方法についてアイデアを持っているなら...
それ以外の場合は、少し調べてみると、インターフェースを照会して直接使用することも可能であることがわかりましたが、あまり理解できず、問題が解決するかどうかわかりません。
私は Windows7 64 ビット プラットフォームを使用しており、コンパイラとして msvc2012 を使用しています。現在 Qt 5.1.0 を使用していますが、5.0.2 でも動作しませんでした。