FormatMessage っていう Win32 API がありますよね。
GetLastError と組み合わせて、エラーの説明を取得するのが代表的な使い方だと思いま
すが。
この関数の dwFlags パラメータに FORMAT_MESSAGE_ALLOCATE_BUFFER を渡すと、関数は
必要な長さのバッファを LocalAlloc によって自動的に確保してくれる。便利です。
で、メッセージを使い終わったら、アプリはこれを LocalFree で解放しなければならな
い。MSDN にもしっかりと、そう書かれています。
ところで、
LocalAlloc で確保したメモリって、実際に使用するためには LocalLock するんですよ
ね?で、使い終わったら LocalUnlock、LocalFree の順に後始末、と。
MSDN にある、FormatMessage の使用例には、これが欠けている気がするのですが。
以下引用。
引用始まり-----------------------------------------------------------------
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), // 既定の言語
(LPTSTR) &lpMsgBuf,
0,
NULL
);
// 文字列を表示する。
MessageBox(NULL, (LPCTSTR)lpMsgBuf, Error, MB_OK | MB_ICONINFORMATION);
// バッファを解放する。
LocalFree(lpMsgBuf);
引用終わり-----------------------------------------------------------------
FormatMessage が LocalLock までやってくれれば、すぐに MessageBox で使用できます
が、それだと LocalFree の前に LocalUnlock が必要なはず。
試してみると、大抵の場合、LocalAlloc で返されるハンドルの値と LocalLock で返さ
れるポインタの値は同じなので問題がないですが、それが必ずしも同一だとは明記され
ていませんし、同一だと保証されているなら、Alloc と Lock という2段階の手続きが
必要な理由がわかりません。
これについて、何か情報をお持ちでしたら教えていただけないでしょうか?
表題にあるとおり「素朴な疑問」であって、そう切羽詰った問題でもないので放置でも
構いませんが。
それと、「そんなことは Win32 API の設計者にでも聞かないとわかりません」というレ
スはご遠慮願います。
…すいません、放置してください。
LocalAlloc に LMEM_FIXED っていうフラグあるじゃん。これを使えば Lock/Unlock 要
らないんだ。
くだらない発言でログ流してごめんなさい。
できれば削除希望。