QtでActiveXコントロールとCOMを使う

QAxContainer モジュールはActiveQtフレームワークの一部です。ActiveX コントロールのコンテナとして機能するQWidget のサブクラスQAxWidget と、視覚的でない COM オブジェクトに簡単にアクセスできるQObject のサブクラスQAxObject を実装したライブラリを提供します。これらのクラスを使用して組み込まれたCOMオブジェクトのスクリプトは、QAxScriptQAxScriptManagerQAxScriptEngine クラスを通じて可能であり、一連のツールにより、プログラム的にCOMオブジェクトに簡単にアクセスできます。

このモジュールは、以下の6つのクラスで構成されています。

  1. QAxBase は、COM オブジェクトや ActiveX コントロールを初期化し、アクセスするための API を提供する抽象クラスです。
  2. QAxObject COM オブジェクトをラップする を提供します。QObject
  3. QAxWidget は ActiveX コントロールをラップする です。QWidget
  4. 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も参照してください

© 2025 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.