2012-08-14 52 views
1

我寫一個函數如下:C++和寫入枚舉值到Windows註冊表

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個日誌記錄級別必須顯示調試,錯誤...在註冊表中,如果0沒有應該顯示和記錄被禁用。

+2

'if(value = 1)'should should'if(value == 1)' – Henrik 2012-08-14 09:53:12

+0

您是否想要寫入枚舉的名稱而不是值?所以「入門」而不是0? – 2012-08-14 09:57:07

+0

@BenRuijl @BenRuijl我想要的是用戶進入註冊表,去位置並需要設置日誌開/關1代表登錄,如果用戶選擇,那麼他必須能夠選擇日誌級別作爲調試錯誤通知或警告,如果他選擇0所有這些選項都必須是diabled – 2012-08-14 09:59:55

回答

3

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

如果你想這個字符串轉換回枚舉,最簡單的方法是創建字符串映射到您的枚舉類型:

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); } 

} 

如果你想避免複雜,如果結構,你也可以嘗試和枚舉映射到值和比較。例如,警告= 1和ALL = 0.然後,您可以檢查是否curLevel < type以查看記錄器是否應該記錄。

+0

@ BenRuiji:我寫這個在一個類中,我有一些日誌語句在其他類中,我如何將這與記錄語句也與此一起,如果用戶選擇頂級調試,他必須看到調試通知錯誤語句全部 – 2012-08-14 10:34:21

+0

在這個類中,它應該是一個單例,你必須定義一個函數'log',它將消息和日誌級別作爲參數。然後,如果日誌級別足夠高以便打印,則可以檢入此功能。所有其他的類都應該調用這個類的'log'函數。 – 2012-08-14 10:42:31

+0

我有一個日誌功能如下: static int log(Logger * logger,TYPE type,string sClassName,string sMethodName,string sMessage =「」)if(logger){ switch(type){ case Entry:logger - > WriteEntry(sClassName,sMethodName); return 0; – 2012-08-14 10:45:20