CoUninitialize

先日の「なんで俺、COINIT_MULTITHREADでうごかしてたんやろ。」の原因が究明された。


昨日いろいろとテストをしてたんだけど、その際に、発覚したのが、

詳細にチェックを入れて部屋を作成するとエラーが出る

という問題。
エラーが出ている場所は、DirectPlayVoiceのテストが必要かどうかをチェックしている場所。
起動時に、DirectPlayVoiceのテストが必要ならばそのテストを行うためのウィザードを起動するのだが、そこでエラーが発生していた。エラーの内容は、「CoInitializeが呼ばれてません。」
ありえへん。
アプリの起動時にちゃんとCoInitializeしてる。。。
Voiceのテストが呼ばれているスレッドがメインスレッドと違うものになっているかと思い、調べてみるがそんな形跡はなし。俺はスレッド起こしてないから、DirectPlayが勝手にスレッド起こしているのかなぁとかいろいろ想像してみたり。
しかし、詳細にチェックを入れたときのみに、エラーが出るのも奇妙。どこが動きが違うかといえば、詳細にチェックを入れると、部屋の作成ダイアログが出るところ。そのあたりを調べる。
どんなデコーダがDirectPlayVoiceにインストールされているかを列挙する部分が怪しい。
こいつをコメントアウトすると問題なく動くようになる。
うーん。
あ~~~~。
こんなところで、CoUninitializeしてる。。。
一気に記憶がよみがえってきた。
このデコーダの列挙の部分を単体で、テストコードを書いたのであった。ちゃんと列挙できるかどうか確認するために。。。
そのときに当然そのテストプログラムで、CoInitializeしている。ご丁寧にUnCoinitializeもしてる。
テストコードでちゃんと動いたので、VoiceChatに放り込むときに、カットアンドペースト。
CoInitializeを削除して終了。そのときに、UnCoinitializeを削除するのを忘れたらしい。
んで、次にDirectPlayVoiceのテストのところで、「CoInitializeが呼ばれてません」エラーになって。。。
まさかそんなところでUnCoinitializeしてるなんておもわへんから。なんでやろ~なんでやろ~って思った挙句に、起動時にCOINIT_MULTITHREADした模様。
COINIT_MULTITHREADにしたら、全部動いたのよ。根拠のないCOINIT_MULTITHREADですわ。
ということで、他にCoInitializeやUncoinitializeが混ざりこんでないか確認。
綺麗に整理して動作確認すると、ちゃんと動く。
うーん。思わぬところに、思わぬバグがいたもんだ。

「CoUninitialize」への1件のフィードバック

  1. 仕事で音声チャットできんかと調べていて、
    VoiceChatをベクターからダウンロードし、
    DirectPlayVoiceの事を調べていたらここに
    たどり着きました。作者さんだったのですね(^^;
    外から見た動きだけですがVoiceChat参考に
    させていただきました。
    ありがとうございました。(^^)

コメントを残す