1

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 でも動作しませんでした。

4

1 に答える 1

1

dynamicCallでは本当にできないと思います。私は最終的にそれを行う方法を見つけました。思ったより簡単でした。Qt のインストールには、dumpcpp というツールが付属しています。私にとってのフル パスは C:\Qt\Qt5.1.0x86\5.1.0\msvc2012\bin\dumpcpp.exe でした (明らかに設定によって異なります)。bin フォルダーをパスに追加するだけで、使いやすくなります。次に、プロジェクト フォルダーに移動し、次のコマンドを実行しました。

dumpcpp -nometaobject {00062FFF-0000-0000-C000-000000000046} (CLSID は単なる例であり、私が使用したものではありません)

ヘッダー ファイルを作成し、COM オブジェクトを使用しようとしているファイルに含めることができます。

私の場合、このファイルには名前空間 (MeasurementLib) に 2 つのクラス (IClassMeasurement と ClassMeasurement) がありました。繰り返しますが、名前は実際のものではありません。

最初のプロジェクト ファイルでは、次のように目的の関数を呼び出すことができます。

MeasurementLib::ClassMeasurement test; //Do not use IClassMeasurement, you only get write access violations
QVariant rangesVar;
int p1 = 0;
int p2 = 0;
int p3 = 0;
test.getRanges(p1,p2,p3,ranges);
QStringList ranges = ranges.toStringList();

それが誰かを助けることを願っています!

于 2013-08-14T09:19:38.073 に答える