杉山利幸の公開日誌 2024年6月分

2024年7月分

2024/06/29 sug02 を復活させてしまいました
2024/06/01 CComPtr と CoUninitialize


2024/06/29 sug02 を復活させてしまいました

ここで sug03 への Virtual PC 2007 のインストールは断念していましたが、Windows 95 などの環境を残しておきたかったので(別にソフトの旧バージョンのサポートをしたい訳ではなく、単なる自己満足)、sug02 を復活させてしまいました。
新環境はここです。

復活のための条件として、新しいケースと電源が必要だったのですが、安売りしている電源付きケース Scythe サイズ Micro-ATX スリムケース OTTER を買ってしまいました。

トラブルに関しては次回以降に


2024/06/01 CComPtr と CoUninitialize

以下のソースを見てください。
//---------------------------------------------------------------------------
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;
}
//---------------------------------------------------------------------------

めでたしめでたし


2024年5月分

戻る