はまり中から復活

前回の「うーん。はまったかも。」という書き込みから、まじめにはまり込んでいます。
じぇんじぇん動きません。こりゃ困ったなぁ。


で、今日はいろいろ調査のために試験プログラムを書いた。
今まで、

C#アプリexe→C#クラスdll→C#クラスdll→ManagedC++クラスdll→C++COM

という構成で正しく動いていたアプリから、C#クラスDLL以下をごそっと強奪して再利用しようと目論んでいる。
現在、

C++アプリexe→C#クラスdll→C#クラスdll→ManagedC++クラスdll→C++COM

という流れで呼び出していて、ManagedC++クラスの中で、C++COMを起動しようと、CoCreateInstanceすると、0x80004002(インターフェイスがサポートされていません )が返ってきてしまうという問題でつっかえています。
正しく動いていたアプリとの違いは、一番上が、C#で書かれているかC++で書かれているかの違い。
出力を見る限りでは、COMのDLLの読み込みはされているので、CoCreateInstance自体はできている模様。
CoCreateInstanceをIUnknown*で受けるとちゃんと取れる。でも、対象のインターフェースにQueryInterfaceをかけるとやっぱりエラー。
うーん。
んじゃ、本当にこのクラスで正しく動くのか、すんげぇシンプルなテストプログラムを書いて実験。

C#アプリexe→C#クラスdll→C#クラスdll→ManagedC++クラスdll→C++COM

C#アプリexeはほとんど空っぽで下のC#のクラスのインスタンスを作って、メソッド一発初期化かけるだけ。
あれれ?ちゃんと動く。
うーん。
次に、C++があかんのかと思い、シンプルなテストプログラムをC++で作成。もちろんコンソールアプリ。

C++アプリexe→C#クラスdll→C#クラスdll→ManagedC++クラスdll→C++COM

C#のときと同様にほとんど空っぽで下のC#のクラスのインスタンスを作って、メソッド一発初期化かけるだけ。
あれれれ?ちゃんと動く。
うーん。
どうにもNPモジュールに何か悪さしているものがいるらしい。。
うーーーん。
テストプログラムと何が違うんだろう。。。
ふと思いついた。
そういえば、テストプログラムは、シングルスレッドだから、
CoInitialize( NULL);
NPモジュールは、DirectPlayを使っててマルチスレッドだから、
CoInitializeEx( NULL, COINIT_MULTITHREADED);
これか?
テストプログラムを、CoInitializeから、CoInitializeExに変更すると、
きたーーーーーーーー
同じ症状になる。
ということは、このCOMモジュールはMULTITHREADEDでは起動しちゃだめってことだな。
うーん。おらの苦手なアパートの問題だったか。
ということで、COINIT_APARTMENTTHREADEDで起動して。。。
ついでに、メインスレッド側で、CoCreateを呼び出せば。。。。
きたーーーーーーーー
形態素解析エンジンがうごいたぁ。
ん?んじゃなんで、るすぢは返事をしないのだ?
で、調べていくと、部屋の中にいる人間の数のカウントがおかしいらしい。
なーんだ。そんなことか、とりあえず、テスト用に、ちょいちょいと、修正して。。一人に固定。
きたーーーーーーーー
そんなるすぢの、第一声は。。。

「あやだよ>User」

相変わらずシュールです。
これで、先に進めるぞぉ。

コメントを残す

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください