Program/WinAPI32

  • エラーログ処理のクラス化
    • ファイルへのログ化とOutputDebugString?での出力
      結構手抜きなコードですが、あるとデバックに便利です。
    • エラーログファイルは、実行フィルのディレクトリを取得してその直下に保存するように設定していますが、適時変更したほうがよい項目です。
////////////////////////////////////////////////////////////////////////////////
// CErrProsess.h
//
// 基幹ヘッダー:エラーの表示、ログ保存などを一括処理
//
////////////////////////////////////////////////////////////////////////////////
#ifndef CERRPROSESS_H
#define CERRPROSESS_H

#include <windows.h>
#include <stdio.h>        //標準
#include <stdlib.h>
#include <objbase.h>    // COM+インターフェイス
#include <time.h>

#include <string>
#include <vector>
#include <algorithm>

namespace ErrProsess
{
    class CErrProsess
    {
    private:
        ////////////////////////////////////////////////////////////////////////////////
        //    ローカル定数
        ////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////
        //    ローカル構造体
        ////////////////////////////////////////////////////////////////////////////////
        // 実行フォルダ
        char m_cFilePath[_MAX_PATH];
        HANDLE    m_hFile;            //ファイルハンドル

        ////////////////////////////////////////////////////////////////////////////////
        //    ローカル変数
        ////////////////////////////////////////////////////////////////////////////////
        std::string m_stFileStr;

        ////////////////////////////////////////////////////////////////////////////////
        //    ローカル関数の宣言
        ////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////
        // 実行フォルダの取得
        ////////////////////////////////////////////////////////////////////////////////
        void GetExePath(void);
        ////////////////////////////////////////////////////////////////////////////////
        // エラーログ連結元読み込み
        ////////////////////////////////////////////////////////////////////////////////
        bool LoadErrLogFile(void);
        ////////////////////////////////////////////////////////////////////////////////
        // エラーログ保存
        ////////////////////////////////////////////////////////////////////////////////
        bool SaveErrLogFile(void);

    protected:
        ////////////////////////////////////////////////////////////////////////////////
        //    プロテクト変数
        ////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////
        //    プロテクト関数の宣言
        ////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////
        // クラスの初期化
        // コンストラクタ
        ////////////////////////////////////////////////////////////////////////////////
        CErrProsess(void);

        ////////////////////////////////////////////////////////////////////////////////
        // クラスの後始末
        // デストラクタ
        ////////////////////////////////////////////////////////////////////////////////
        virtual ~CErrProsess();

    public:
        ////////////////////////////////////////////////////////////////////////////////
        //    グローバル定数
        ////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////
        //    グローバル構造体
        ////////////////////////////////////////////////////////////////////////////////
        ////////////////////////////////////////////////////////////////////////////////
        //    グローバル変数
        ////////////////////////////////////////////////////////////////////////////////

        ////////////////////////////////////////////////////////////////////////////////
        // エラーメッセージの吐き出し
        // 渡し値:char* lpErrArea エラーを起こした関数名
        // 渡し値:LPSTR lpStr 吐き出すエラーメッセージ
        // 渡し値:LPSTR lpStr2 吐き出すエラーメッセージ2
        /*
          YYYY/mm/dd xx:xx < ファイル吐出しのみ
          ----------  %d err  ----------\n
          lpErrStr : lpErrStr2
        \n----------%d err end----------\n
        */
        ////////////////////////////////////////////////////////////////////////////////
        void PrintErrStr(const char* lpErrArea, const char* lpErrStr);
        void PrintErrStr(const char* lpErrArea, const char* lpErrStr, const char* lpErrStr2);

    };

};


#endif CERRPROSESS_H
////////////////////////////////////////////////////////////////////////////////
// CErrProsess.cpp
//
// 基幹:エラーの表示、ログ保存などを一括処理
//
////////////////////////////////////////////////////////////////////////////////
#include "cerrprosess.h"

namespace ErrProsess
{
    ////////////////////////////////////////////////////////////////////////////////
    // 実行フォルダの取得
    ////////////////////////////////////////////////////////////////////////////////
    void CErrProsess::GetExePath(void)
    {
        // 実行ファイルのフルパス取得
        char szPath[_MAX_PATH];
        // フルパスを分解
        char szDir[_MAX_DIR];
        char szDrive[_MAX_DRIVE];
        char szFName[_MAX_FNAME];
        char szExt[_MAX_EXT];

        // 実行ファイルのフルパス取得
        GetModuleFileName( NULL, szPath, MAX_PATH);

        // フルパスを分解
        _splitpath(szPath,szDrive,szDir,szFName,szExt);

        // フォルダ、ファイル名取得
        sprintf(m_cFilePath,"%s%s",szDrive,szDir);

    }

    ////////////////////////////////////////////////////////////////////////////////
    // エラーログ連結元読み込み
    ////////////////////////////////////////////////////////////////////////////////
    bool CErrProsess::LoadErrLogFile(void)
    {
        char    szUsrFile[MAX_PATH] = "";                //ユーザーファイル
        DWORD dwRWBytes;
        DWORD    dSize;
        char    *cTemp;
        DWORD    dwFileSize;
        BOOL    bRes = true;

        if (m_cFilePath[lstrlen(m_cFilePath) - 1] != '\\' && m_cFilePath[lstrlen(m_cFilePath) - 1] != '/')
        {
            //終端文字がデリミタでなければ付加する
            strcat(m_cFilePath, "\\");
        }
        sprintf(szUsrFile,"%serrlog.txt",m_cFilePath);

        //ファイルをRWで開く
        m_hFile = CreateFile(szUsrFile, GENERIC_READ | GENERIC_WRITE, 0, NULL, OPEN_ALWAYS, FILE_FLAG_SEQUENTIAL_SCAN, 0);
        if (m_hFile == NULL || m_hFile == (HANDLE)HFILE_ERROR)
        {
            //ファイルがない
            return false;
        }
        // ファイルの容量を取得
        dwFileSize = GetFileSize(m_hFile, &dSize);
        cTemp = new char[dwFileSize + 1];

        ZeroMemory(cTemp, dwFileSize + 1);

        // ファイルポインタをファイルの頭に戻す
        SetFilePointer(m_hFile, 0, 0, FILE_BEGIN);
        // 実際の読み込み
        ReadFile(m_hFile, cTemp, dwFileSize, &dwRWBytes, NULL);
        if(dwRWBytes != dwFileSize)
        {
            CloseHandle(m_hFile);
            return false;
        }

        m_stFileStr = cTemp;

        delete[] cTemp;

        return true;
    }// CErrProsess::LoadErrLogFile(void)

    ////////////////////////////////////////////////////////////////////////////////
    // エラーログ保存
    ////////////////////////////////////////////////////////////////////////////////
    bool CErrProsess::SaveErrLogFile(void)
    {
        DWORD dwRWBytes;
        DWORD    dSize;
        BOOL    bRes = true;

        //実際の書き込み
        SetFilePointer(m_hFile, 0, 0, FILE_BEGIN);            //ファイルポインタをファイルの頭に戻す

        dSize = m_stFileStr.size();

        bRes = WriteFile(m_hFile, m_stFileStr.data(), dSize , &dwRWBytes, NULL);
        if (!bRes || dwRWBytes != (UINT)dSize)
        {
            CloseHandle(m_hFile);
            return false;
        }

        CloseHandle(m_hFile);

        return true;
    }// CErrProsess::SaveErrLogFile(void)

    ////////////////////////////////////////////////////////////////////////////////
    // エラーメッセージの吐き出し
    // 渡し値:char* lpErrArea エラーを起こした関数名
    // 渡し値:LPSTR lpStr 吐き出すエラーメッセージ
    // 渡し値:LPSTR lpStr2 吐き出すエラーメッセージ2
    /*
      YYYY/mm/dd xx:xx < ファイル吐出しのみ
      ----------  %d err  ----------\n
      lpErrStr : lpErrStr2
    \n----------%d err end----------\n
    */
    ////////////////////////////////////////////////////////////////////////////////
    void CErrProsess::PrintErrStr(const char* lpErrArea, const char* lpErrStr)
    {
        char cDay[9];
        char cTime[9];
        char cTemp[54];
        std::string m_stErrStr;

        LoadErrLogFile();

        _strdate(cDay);        // mm/dd/yy形式で日付を文字列に格納
        _strtime(cTime);    // hh:mm:ss形式で時刻を文字列に格納

        m_stFileStr += cDay;
        m_stFileStr += " ";
        m_stFileStr += cTime;
        m_stFileStr += "\n";

        sprintf(cTemp, "----------  %s err  ----------\n", lpErrArea);
        m_stErrStr = cTemp;
        m_stErrStr += lpErrStr;
        sprintf(cTemp, "\n----------%s err end----------\n\n", lpErrArea);
        m_stErrStr += cTemp;

        #ifndef DEBUG
            OutputDebugString(m_stErrStr.c_str());
        #endif

        m_stFileStr += m_stErrStr;

        SaveErrLogFile();

    }// CErrProsess::PrintErrStr(char* lpErrArea, char* lpErrStr)

    void CErrProsess::PrintErrStr(const char* lpErrArea, const char* lpErrStr, const char* lpErrStr2)
    {
        char cDay[9];
        char cTime[9];
        char cTemp[128];
        std::string m_stErrStr;

        LoadErrLogFile();

        _strdate(cDay);        // mm/dd/yy形式で日付を文字列に格納
        _strtime(cTime);    // hh:mm:ss形式で時刻を文字列に格納

        m_stFileStr += cDay;
        m_stFileStr += " ";
        m_stFileStr += cTime;
        m_stFileStr += "\n";

        sprintf(cTemp, "----------  %s err  ----------\n", lpErrArea);
        m_stErrStr = cTemp;
        m_stErrStr += lpErrStr;
        m_stErrStr += " : ";
        m_stErrStr += lpErrStr2;
        sprintf(cTemp, "\n----------%s err end----------\n\n", lpErrArea);
        m_stErrStr += cTemp;

        #ifndef DEBUG
            OutputDebugString(m_stErrStr.c_str());
        #endif

        m_stFileStr += m_stErrStr;

        SaveErrLogFile();

    }// CErrProsess::PrintErrStr(char* lpErrArea, char* lpErrStr, char* lpErrStr2)

    ////////////////////////////////////////////////////////////////////////////////
    // クラスの初期化
    // コンストラクタ
    ////////////////////////////////////////////////////////////////////////////////
    CErrProsess::CErrProsess(void)
    {
        GetExePath();
    }// CErrProsess::CErrProsess(void)

    ////////////////////////////////////////////////////////////////////////////////
    // クラスの後始末
    // デストラクタ
    ////////////////////////////////////////////////////////////////////////////////
    CErrProsess::~CErrProsess()
    {
    }// CErrProsess::~CErrProsess()


};