Log を出力する

プログラムでエラーや処理内容を Log ファイルに出力するには、下記のような関数を作成することで実装できます。

VOID Log(LPCWSTR lpszText)
{
	WCHAR szFilePath[MAX_PATH];
	GetModuleFileNameW(0, szFilePath, _countof(szFilePath));
	PathRenameExtensionW(szFilePath, L".log");
	HANDLE hFile = CreateFileW(szFilePath, GENERIC_WRITE, 0, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0);
	if (hFile != INVALID_HANDLE_VALUE)
	{
		DWORD dwWriteSize;
		if (GetLastError() == ERROR_ALREADY_EXISTS)
		{
			SetFilePointer(hFile, 0, 0, FILE_END);
		}
		else
		{
			BYTE bom[2] = { 0xFF, 0xFE };
			WriteFile(hFile, bom, 2, &dwWriteSize, NULL);
		}
		{
			SYSTEMTIME st;
			GetLocalTime(&st);
			WCHAR szText[256];
			wsprintfW(szText, L"[%04d-%02d-%02d %02d:%02d:%02d:%03d] ", st.wYear, st.wMonth, st.wDay, st.wHour, st.wMinute, st.wSecond, st.wMilliseconds, lpszText);
			WriteFile(hFile, szText, lstrlenW(szText) * sizeof(WCHAR), &dwWriteSize, 0);
		}
		WriteFile(hFile, lpszText, lstrlenW(lpszText) * sizeof(WCHAR), &dwWriteSize, 0);
		WriteFile(hFile, L"\r\n", 2 * sizeof(WCHAR), &dwWriteSize, 0);
		CloseHandle(hFile);
	}
}

実行例

Log(L"ログです");

UTF-16 でログを書き出しているため、ログファイルを新規作成した場合には、ファイルの先頭に BOM を挿入するようにしています。


スポンサーリンク
広告1
広告1

シェアする

  • このエントリーをはてなブックマークに追加

フォローする

スポンサーリンク
広告1