簡體   English   中英

C ++並將枚舉值寫入Windows注冊表

[英]C++ and writing enum values into Windows registry

我正在寫一個函數如下:

bool abc::GetLoggingStatus() {
    //true or false is returned
    int value;
    if (regKey->HasValue("LoggingStatus")) {
        regKey->QueryValue("LoggingStatus", &value);
        if (value == 1)
            return true; //no logging possible
        else
            return false;
    }
    regKey->SetValue("LoggingStatus", 1);
    return true;
}

記錄級別定義為:

typedef enum {
    Entry,
    Exit,
    Debug,
    Warning,
    Notification,
    Error
} TYPE;

如果我選擇1記錄級別,我需要顯示的是調試,錯誤...在regedit中,如果0則不顯示任何內容並禁用日志記錄。

您無法在regedit中創建下拉菜單,但您可以創建一個名為LoggingLevel的新條目。 如果LoggingStatus為0,則忽略此條目LoggingLevel是定義級別的字符串。

如果要將此字符串轉換回枚舉,最簡單的方法是創建從字符串到Enum類型的映射:

std::map<std::string, TYPE> typeMap;
typeMap["Warning"] = Warning;
...

在您的代碼中,您查詢日志記錄級別:

char* level;
regKey->QueryValue("LoggingLevel", level);
TYPE theLevel = typeMap[level];

當然,您需要進行適當的錯誤檢查。

編輯

您應該添加兩個函數來獲取日志設置, shouldLog()getLevel() 日志功能如下所示:

void log(Logger* logger, TYPE type, string sClassName, string sMethodName, string sMessage = "") { 
if (!logger || !abc::shouldLog()) {
   return;
}


TYPE curLevel = abc::getLevel();
bool shouldLog = false;

if (type == Warning && (curLevel == All || curLevel == Warning) ...) {
  shouldLog = true;
}

if (shouldLog) {logger->WriteEntry(sClassName, sMethodName); }

}

如果你想避免復雜的if結構,你也可以嘗試將枚舉映射到一個值並進行比較。 例如,Warning = 1且ALL = 0.然后,您可以檢查curLevel < type是否記錄,以查看記錄器是否應該記錄。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM