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 、およびQAxScriptEngine は、Windows Script Host へのインターフェースを提供します。
標準の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の例を参照してください。
Call-by-Name
QAxBase::dynamicCall() およびQAxBase::querySubObject()、さらにQObject::setProperty() およびQObject::property() API を使用して、COM オブジェクトのメソッドやプロパティを名前で呼び出します。dumpdocツールを使用すると、任意の COM オブジェクトおよびそのサブオブジェクトに関する Qt API のドキュメントを取得できます。ただし、COM オブジェクトの API のすべてが利用可能とは限らない点に注意してください。
スクリプトエンジンを介した関数の呼び出し
Qtアプリケーションは、システムにインストールされている任意のActiveScriptエンジンをホストできます。これにより、スクリプトエンジンはCOMオブジェクトにアクセスするスクリプトコードを実行できるようになります。
スクリプトエンジンをインスタンス化するには、QAxScriptManager::addObject() を使用してスクリプトからアクセスしたい COM オブジェクトを登録し、QAxScriptManager::load() を使用してスクリプトコードをエンジンに読み込みます。その後、QAxScriptManager::call() またはQAxScript::call() を使用してスクリプト関数を呼び出します。
スクリプトを通じて利用可能な COM オブジェクトの API は、使用するスクリプト言語によって異なります。
ActiveX テスト コンテナでは、スクリプト ファイルの読み込みを実演しています。
ネイティブ COM インターフェースを使用した関数の呼び出し
上記のいずれの方法でもアクセスできない COM オブジェクトの関数を呼び出すには、QAxBase::queryInterface() を使用して COM インターフェースを直接要求することができます。それぞれのインターフェースクラスの C++ 定義を取得するには、コントロールに付属のタイプライブラリとともに#import ディレクティブを使用します。詳細については、お使いのコンパイラのマニュアルを参照してください。
代表的なエラーメッセージ
ActiveQt は、実行時にエラー状況が発生すると、デバッグ出力にエラーメッセージを出力します。通常、これらのメッセージを確認するには、デバッガでプログラムを実行する必要があります(例:Visual Studio の「デバッグ出力」)。
QAxBase::internalInvoke: そのようなメソッドはありません
QAxBase::dynamicCall() の呼び出しに失敗しました。関数のプロトタイプが、オブジェクトの API で利用可能な関数と一致しませんでした。
IDispatch メンバーの呼び出しエラー: 必須パラメータが欠落しています
QAxBase::dynamicCall() の呼び出しに失敗しました。関数のプロトタイプは正しかったものの、指定されたパラメータの数が不足していました。
IDispatch メンバーの呼び出しエラー: パラメータ n の型不一致
QAxBase::dynamicCall() の呼び出しに失敗しました。関数のプロトタイプは正しかったものの、インデックスn のパラメータの型が正しくなく、正しい型へ変換できませんでした。
QAxScriptManager::call(): この関数を提供するスクリプトがありません
イントロスペクション機能を提供しないエンジン(ActivePython や ActivePerl など)を通じて提供される関数を呼び出そうとしています。該当するQAxScript オブジェクト上で直接その関数を呼び出す必要があります。
ActiveQt フレームワークも参照してください 。
© 2026 The Qt Company Ltd. Documentation contributions included herein are the copyrights of their respective owners. The documentation provided herein is licensed under the terms of the GNU Free Documentation License version 1.3 as published by the Free Software Foundation. Qt and respective logos are trademarks of The Qt Company Ltd. in Finland and/or other countries worldwide. All other trademarks are property of their respective owners.