QtでActiveXコントロールとCOMを使う
QAxContainer モジュールはActiveQtフレームワークの一部です。ActiveX コントロールのコンテナとして動作するQWidget のサブクラスQAxWidget と、視覚的でない COM オブジェクトに簡単にアクセスできるQObject のサブクラスQAxObject を実装したライブラリを提供します。これらのクラスを使用して組み込まれたCOMオブジェクトのスクリプトは、QAxScript 、QAxScriptManager 、QAxScriptEngine クラスを通じて可能であり、一連のツールにより、プログラム的にCOMオブジェクトに簡単にアクセスできます。
このモジュールは 6 つのクラスから構成されています。
- QAxBase は、COM オブジェクトまたは ActiveX コントロールを初期化し、アクセスするための API を提供する抽象クラスです。
- QAxObject COM オブジェクトをラップする を提供します。QObject
- QAxWidget は ActiveX コントロールをラップする です。QWidget
- QAxScriptManager QAxScript および は、Windows スクリプトホストへのインタフェースを提供する。QAxScriptEngine
標準 ActiveX コントロールを使用して高レベルのユーザー・インターフェイス機能を提供するアプリケーションの例をいくつか示します。
ライブラリの使用
COM オブジェクトや ActiveX コントロールをホストできる Qt アプリケーションを構築するには、QAxContainer モジュールにリンクします。
QT += axcontainer
をアプリケーションの.pro
ファイルに追加します。
QAxContainer アプリケーションの配布
QAxContainer ライブラリは静的なので、このモジュールを使用する際に追加ファイルを再配布する必要はありません。ただし、使用する ActiveX サーバー・バイナリがターゲット・システムにインス トールされていない可能性があるため、パッケージと一緒に出荷し、アプリケーションの インストール・プロセスで登録する必要があります。
COM オブジェクトのインスタンス化
COM オブジェクトをインスタンス化するには、QAxBase::setControl() API を使用するか、使用するQAxBase サブクラスのコンストラクタにオブジェクト名を直接渡します。
コントロールはさまざまな形式で指定できますが、最も高速で強力な形式は、オブジェクトのクラス ID (CLSID) を直接使用することです。クラスIDには、オブジェクトが実行されるべきリモート・マシンに関する情報を付加することができ、ライセンス・コントロールの場合はライセンス・キーを含めることができます。
典型的なエラーメッセージ
ActiveQtは、実行時にエラー状況に遭遇すると、デバッグ出力にエラーメッセージを表示します。通常、これらのメッセージを表示するには、デバッガでプログラムを実行する必要があります(Visual Studio のデバッグ出力など)。
要求されたコントロールをインスタンス化できませんでした。
QAxBase::setControl() で要求されたコントロールは、このシステムにインストールされていないか、現在のユーザがアクセスできません。
コントロールには管理者権限またはライセンス・キーが必要な場合があります。コントロールにライセンスがある場合は、QAxBase::setControl にライセンスキーを渡します。
オブジェクト API へのアクセス
ActiveQt は COM オブジェクトへの Qt API を提供し、COM のデータ型を Qt の同等物に置き換えます。
COM オブジェクトの API を呼び出すには、4 つの方法があります:
- C++ 名前空間の生成
- 名前による呼び出し
- スクリプトエンジンを使用する
- ネイティブの COM インタフェースを使用する
C++ 名前空間の生成
アクセスするタイプ・ライブラリの C++ 名前空間を生成するには、dumpcppツールを使用します。使用するタイプ・ライブラリに対してこのツールを手動で実行するか、アプリケーションの.pro
ファイルのTYPELIBS
変数にタイプ・ライブラリを追加してビルド・システムに統合します:
TYPELIBS = file.tlb
dumpcppは型ライブラリのすべてのAPIを公開できないかもしれないことに注意してください。
生成されたC++クラスを通してオブジェクトAPIにアクセスするために、生成されたヘッダーファイルをコードにインクルードしてください。詳細については、Qutlookの例を参照してください。
コール・バイ・ネーム
QAxBase::dynamicCall ()、QAxBase::querySubObject ()、QObject::setProperty ()、QObject::property () API を使用して、COM オブジェクトのメソッドとプロパティを名前から呼び出します。COM オブジェクトとそのサブオブジェクトの Qt API のドキュメントを取得するには、dumpdocツールを使用します。
スクリプトエンジンを介した関数の呼び出し
Qt アプリケーションは、システムにインストールされている ActiveScript エンジンをホストすることができます。スクリプトエンジンは、COM オブジェクトにアクセスするスクリプトコードを実行することができます。
スクリプトエンジンをインスタンス化するには、QAxScriptManager::addObject() を使用してスクリプトからアクセスしたい COM オブジェクトを登録し、QAxScriptManager::load() を使用してスクリプトコードをエンジンにロードします。次に、QAxScriptManager::call() または QAxScript::call() を使用してスクリプト関数を呼び出します。
COM オブジェクトのどの API をスクリプトで使用できるかは、使用するスクリプト言語に依存します。
ActiveX Test Containerでは、スクリプト・ファイルのロードについて説明します。
ネイティブ COM インターフェースを使用した関数の呼び出し
上記のいずれの方法でもアクセスできない COM オブジェクトの関数を呼び出すには、QAxBase::queryInterface ()を使用して COM インターフェースを直接要求します。各インタフェース・クラスの C++ 定義を取得するには、#import
指令を、コントロールに付属するタイプ・ライブラリとともに使用します。詳細は、コンパイラのマニュアルを参照してください。
典型的なエラーメッセージ
ActiveQtは、実行時にエラーが発生した場合、デバッグ出力にエラーメッセージを表示します。通常、これらのメッセージを確認するには、デバッガでプログラムを実行する必要があります(Visual Studio のデバッグ出力など)。
QAxBase::internalInvoke:そのようなメソッドはありません
QAxBase::dynamicCall() が失敗しました - 関数のプロトタイプが、オブジェクトの API で使用可能な関数と一致しませんでした。
IDispatch メンバの呼び出しエラー:オプションでないパラメータがありません。
QAxBase::dynamicCall() が失敗しました - 関数のプロトタイプは正しいのですが、パラメータが少なすぎます。
IDispatch メンバの呼び出しエラー:パラメータ n の型の不一致
AQAxBase::dynamicCall() が失敗しました - 関数のプロトタイプは正しいのですが、インデックスn
のパラメータが誤った型であり、正しい型に強制できませんでした。
QAxScriptManager::call():この関数を提供するスクリプトがありません。
イントロスペクションを提供しないエンジン (ActivePython や ActivePerl など) から提供される関数を呼び出そうとしています。それぞれのQAxScript オブジェクトで関数を直接呼び出す必要があります。
ActiveQt Frameworkも参照してください 。
本ドキュメントに含まれる文書の著作権は、それぞれの所有者に帰属します。 本書で提供されるドキュメントは、Free Software Foundation が発行したGNU Free Documentation License version 1.3に基づいてライセンスされています。 Qtおよびそれぞれのロゴは、フィンランドおよびその他の国におけるThe Qt Company Ltd.の 商標です。その他すべての商標は、それぞれの所有者に帰属します。