繁体   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