COM の親切な対応

COM の exe サーバのスケルトンを作ると、CAtlExeModuleT<> を使ったメインクラスが作成されるんだけど、こいつがなかなか面白いことをしてくれる。


クライアント側がこの COM を生成すると、exe が起動され、このアプリは起動した状態を保ちます。
2つ目の COM を生成しても、この exe は一つです。
で、もし全てのクライアントが終了した場合、この exe は勝手に終了しやがりしてくれます。


どんな風に終了するかというと、ウインドウメッセージを処理している途中に、いきなり解体処理が始まります。
いや実際処理している途中かどうかは分かりませんが、少なくとも CAtlExeModuleT<>::WinMain() のすぐ下の命令は実行されませんでした。


で、この解体処理は、メインクラスを解体します。
どうやら static 変数や global 変数のクリーンアップと同じタイミングでメインクラスのデストラクタを呼んでいるようです。
つまり、解体順序が不定
メインクラスが生成したオブジェクトの解体処理の途中に static 変数を使った部分があるわけですが、その static 変数が先に解体されていた場合は、不正アクセスになってしまいます。
CAtlExeModuleT<>::WinMain() のすぐ下にメインクラスの解体処理を書いても、さっき書いたように、ウインドウメッセージを求めてぐるぐる回っている最中に強制的に停止させているらしく、動作しません。


こんなんだったらデストラクタ呼ばれない方がマシだっちゅー話ですよ。
どうせいっちゅーに。