- MQCLIのインストール
- 1.ソリューションを変換する
- MQSDKをダウンロードしてきて、VC2010でソリューション(*.sln)を開くと2010形式に変換されます。 なおいくつかの子プロジェクトは2010コンパイルに失敗するようなので、深く考えずソリューションから削除してしまいます。
- 2.CLIを有効にする
- MQCLIを有効にするには、プロジェクトの共通言語ランタイム(CLR)オプションを有効にしてコンパイルして下さい。無効の場合MQCLIのコードはすべて無視されます。
- [構成プロパティ>全般>共通言語ランタイムサポート] 「共通言語ランタイムサポート(/clr)」を選択
- またこの設定のためにいくつかの追加設定が必要な場合があるようです。
- [構成プロパティ>C/C++>全般>デバッグ情報の形式] 「C7互換(/Z7)」を選択
- [構成プロパティ>C/C++>コード生成>基本ランタイムチェック] 「既定」を選択
- [構成プロパティ>C/C++>コード生成>ランタイムライブラリ] 「マルチスレッドDLL(/MD)」または「マルチスレッドデバッグDLL(/MDd)」を選択
- [構成プロパティ>リンカー>入力>シンボル参照の強制] 「__DllMainCRTStartup@12」を追記
- [構成プロパティ>リンカー>コマンドライン>追加オプション] 「/NOENTRY」を追記
- 3.mqsdxをプロジェクトに追加
- フォルダ"mqsdx"配下のファイルをすべてそのままプロジェクトフォルダにコピーして、mqsdx内の各ファイルをプロジェクトに追加して下さい。
- MQCLIを使用するソースコードで"mqsdx/MQCLI.hpp"をインクルードして下さい。
#include "mqsdx/MQCLI.hpp"
- MQCLIを使ったプラグイン開発
MQCLIでは、以下のいずれかのクラスを継承し、カスタマイズするだけでプラグインが作れます。
- MQCLI::StationPlugins::StationPlugin
- MQCLI::CommandPlugins::CommandPlugin
これらはMQStationPluginやMQCommandPluginのラッパークラスです。オーバーライドすべき機能やメソッド名は、もともとのメタセコイアプラグインSDKとほぼ同じなので、オリジナルのヘルプファイルをチェックしてください。 ただひとつだけ相違する注意点があります。一度だけそのプラグインクラスの継承インスタンスを確保し、 MQCLI::Initialize() に渡してください。こんなふうに。
#include "mqsdx/MQCLI.hpp"
public:
CustomPlugin() : CommandPlugin( "tiritomato", "Sample Copyright(C) 2013, tiritomato.", "SampleButton" ) {}
virtual BOOL Activate(MQDocument doc, BOOL flag) override {
if ( flag == TRUE ) ::MessageBox( MQ_GetWindowHandle(), "Activate!", NULL, 0 );
return flag;
}
};
このサンプルではコマンドプラグインのActivate()メソッドをオーバーライドして、コマンドボタンを選択した時にメッセージボックスを表示します。 プロジェクト設定に問題なければ、この数行のコンパイルは成功し、そのままプラグインDLLのインストールとテストが実行できるはずです。
- 注意
- MQCLIのプラグイン初期化処理の制約
全ての処理の前に必ず一度だけ MQCLI::Initialize() を呼び出す必要があります。そして、おそらくその唯一安全な方法は成否を示す戻り値をグローバル変数にストアする事です。上述のコードで言えばここが重要。
- C++/CLIを使ったマネージド/アンマネージド混成DLL開発では、DllMain関数を初期化の中心に考える事は出来ません。 DllMainが.Netエンジン初期化完了前に、.Netエンジンの初期化に対して排他的な状態で呼び出されるためです。 このためにDllMain関数からCLIマネージドコード部分の初期化を強行すると処理がロックする危険性があります。 一方、CLRオプションを有効にしてC++/CLIコードをコンパイルした時、 マネージドコードを使った大域変数の動的初期化は.Netエンジンの初期化完了後にコンパイラによって自動的に呼び出されます。
- DllMain()とGetPluginClass()もMQCLIライブラリによって実装されます
- 初期化制約の都合もあり、MQCLIライブラリがDllMain()とGetPluginClass()の実装も行います。 またMQ0xによってプラグインIDなどのハッシュコード生成も自動実装されます( MQ0xの使い方>MQ0xの使い道 を参照)。よってプラグインDLLを開発するのに必要な手順は、以下の作業だけです。
- プラグインクラスを継承する。
- プラグインの初期化処理をクラスコンストラクタに実装する。
- プラグインクラスをDLL起動後に一回だけ確保・初期化(つまりgcnew)して、 MQCLI::Initialize() に渡す。
- 必要に応じてカスタム処理をoverrideしていく。
- リファレンス
MQ0xとMQCLIは共存可能で、MQCLIを使ったプログラミングでも、検索や名前取得などのサポート関数はMQ0xを利用する想定になっています。