MSMQがインストールされていない件

Windowsアプリでスレッド間通信をしようと思って、メッセージキュー(MSMQ)を使おうとしたらはまってしまった…

とりあえずお試しコードを書いて実行してみたらアプリが起動できない。

アプリケーションを正しく初期化できませんでした(0xc0000142)。[OK]をクリックしてアプリケーションを終了してください。

とかメッセージボックスでおっしゃる。
日本語でおk


Google先生に問い合わせてみると、どうやらこのエラーはexeの起動処理中に何かあったときに出るっぽくて原因はさまざまって感じらしい。らちがあかないので、問題を切り分けるためにソースコードをいろいろコメントアウトしては実行してみた。

結果としては、メッセージキュー関連の API を呼んでいるとエラーになるっぽいことが判明した。起動処理でコケているから、もしかしてDLLに何かあるのかと思ってDLL(MQRT.DLL)を実行時にロード(LoadLibrary)するように変更してみた。*1
そうしたら、LoadLibraryがエラーでコケた。やっぱりDLLのロードに問題があるらしい。

GetLastErrorで教えてもらったエラーコードは1114。Borlandヘルプ(たぶん中身はPlatformSDKヘルプ)の「System Error Codes」から1114を探してみる。

1114 A dynamic link library (DLL) initialization routine failed. ERROR_DLL_INIT_FAILED

DLLの初期化でコケている。ということらしい。DllMainでコケている?


試しにGoogle先生に「MQRT.DLL ERROR_DLL_INIT_FAILED」って聞いてみたらこんなサイトがひっかかった。
http://blogs.msdn.com/johnbreakwell/archive/2008/05/14/how-to-tell-if-msmq-is-installed.aspx

try to load Mqrt.dll fails with ERROR_DLL_INIT_FAILED if Message Queuing is not installed.

ってMSMQがインストールされていないですと!?ぉぃぉぃ…


メッセージキューってOS的には中核サービスじゃないのか。仮にもIPC関連でしょ、あんた。Windows(今回試したのはXP SP3)には他にもいろんなIPC関連APIがあるからいらないのかな。
一応「プログラムの追加と削除」の「Windowsコンポーネントの追加と削除」あたりからインストールできるらしい。今確かめたら本当にインストールされていないし…orz チェックボックスがOFFになってる!


プログラマ的には、普通(?)の状態でインストールされていないモノは使いたくないなぁ。するかどうかわからないけど、サポートとか検証とか面倒そうだよねぇ。

とりあえずスレッド間通信は他の仕組みを使おうかな。メールスロットか名前付きパイプあたりかなぁ。

*1:ちなみにDLL名はexeのインポートテーブルをtdump(bcc)で出力して探した