2024/06/29 sug02 を復活させてしまいました
2024/06/01 CComPtr と CoUninitialize
ここで sug03 への Virtual PC 2007 のインストールは断念していましたが、Windows 95 などの環境を残しておきたかったので(別にソフトの旧バージョンのサポートをしたい訳ではなく、単なる自己満足)、sug02 を復活させてしまいました。
新環境はここです。
復活のための条件として、新しいケースと電源が必要だったのですが、安売りしている電源付きケース Scythe サイズ Micro-ATX スリムケース OTTER を買ってしまいました。
トラブルに関しては次回以降に
以下のソースを見てください。
//--------------------------------------------------------------------------- int WINAPI _tWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE, _In_ LPTSTR, _In_ int) { // // CComPtr のテスト CoInitialize(NULL); // CComPtr<...> ...; ... // CoUninitialize(); // return 0; @} //--------------------------------------------------------------------------- |
一見何の問題もなさそうなのですが、@の所で例外が発生します。
何故でしょう?
・
・
・
最初は理由がわからず、CComPtr というスマートポインターにバグがあるのではと思っていましたが、
ネットを調べていてわかりました。盲点でした。
CComPtr による変数の解放は、波括弧の終わり"}"の所で行われるということは
ここ で説明しましたが、上記ソースの@の時には既に CoUninitialize が行われた後です。
よってその前に開放するために以下のようなソースにしました。
//--------------------------------------------------------------------------- int WINAPI _tWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE, _In_ LPTSTR, _In_ int) { // // CComPtr のテスト CoInitialize(NULL); {//CComPtr で作成した変数の解放のため // CComPtr<...> ...; ... // }//ここで CComPtr の変数を解放しないといけない CoUninitialize();//上記の前に CoUninitialize を呼び出すと例外が発生 // return 0; } //--------------------------------------------------------------------------- |
めでたしめでたし