mqsdx 310.0.1 MQPluginSDK Extention Library / mqsdkをC++またはCLI(.Net)拡張するサポートライブラリ

- メインページ
- 関連ページ
- モジュール
- クラス
- ファイル

全て クラス 関数 変数 型定義 プロパティ グループ ページ

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 ref class CustomPlugin : MQCLI::CommandPlugin {
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;
}
};
static bool initialResult = MQCLI::Initialize( gcnew CustomPlugin() );

このサンプルではコマンドプラグインのActivate()メソッドをオーバーライドして、コマンドボタンを選択した時にメッセージボックスを表示します。 プロジェクト設定に問題なければ、この数行のコンパイルは成功し、そのままプラグインDLLのインストールとテストが実行できるはずです。

注意

MQCLIのプラグイン初期化処理の制約

全ての処理の前に必ず一度だけ MQCLI::Initialize() を呼び出す必要があります。そして、おそらくその唯一安全な方法は成否を示す戻り値をグローバル変数にストアする事です。上述のコードで言えばここが重要。

static bool initialResult = MQCLI::Initialize( gcnew CustomPlugin() );

  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していく。

リファレンス
  - モジュール＞MQCLIの一覧
  - モジュール＞MQ0xの一覧

MQ0xとMQCLIは共存可能で、MQCLIを使ったプログラミングでも、検索や名前取得などのサポート関数はMQ0xを利用する想定になっています。