FormatMessage関数とGetLastError関数を使ったエラー内容の取得

naohiro19
記事: 256
登録日時: 14年前
住所: 愛知県

FormatMessage関数とGetLastError関数を使ったエラー内容の取得

投稿記事 by naohiro19 » 11年前

CODE:

//errmsg.h
#pragma once

#include 
#include 
#include 

BOOL ShowErrorMessage(HWND hWnd);

CODE:

//errmsg.cpp
#include "errmsg.h"

BOOL ShowErrorMessage(HWND hWnd)
{
	const int len = 512;
	DWORD result;
	static TCHAR errmsg[len + 1];

	//文字列を正しく表示するための設定
	result = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM,
		NULL, GetLastError(), MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT),
		errmsg, len + 1, NULL);
	//関数が成功したときはメッセージボックスに情報を表示してTRUEを返す
	if (result > 0){
		MessageBox(hWnd, errmsg, TEXT("GetLastError関数の内容"), MB_ICONINFORMATION | MB_OK);
		return TRUE;
	}
	else{
		//関数が失敗したときはFALSEを返す
		return FALSE;
	}
}
FormatMessageで使っているMAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT)はWindowsで設定されている言語に基づき設定されます。
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT)の部分を MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)に書き換えると日本語版のWindowsを私用してる場合でも英語で表示することができます。
最後に編集したユーザー naohiro19 on 2014年7月07日(月) 22:42 [ 編集 2 回目 ]

YuO
記事: 947
登録日時: 14年前

RE: FormatMessage関数とGetLastError関数を使ったエラー内容の取得

投稿記事 by YuO » 11年前

naohiro19 さんが書きました:

CODE:

	//文字列を正しく表示するための設定
	setlocale(LC_ALL, setlocale(LC_CTYPE, ""));
これは何のために,なぜこのように書いているのでしょうか。

putws等でワイド文字をnative environmentのロケールで表示したいだけであれば,

CODE:

setlocale(LC_CTYPE, "");
または

CODE:

setlocale(LC_ALL, "")
でよいと思います。

なお,

CODE:

setlocale(LC_CTYPE, "");
の戻り値は,LC_CTYPEについて以前の環境に戻すための文字列です。
LC_CTYPEでの戻り値をLC_ALLに設定した場合,他のロケールまで書き換わるかもしれませんし,そもそも""で設定しようとした,native environmentのロケールではなく,元のロケール(恐らく"C")に設定しようとすることになります。