📄 wincfg.cxx
字号:
} return FALSE;}BOOL RegistryKey::QueryValue(const PString & value, DWORD & num, BOOL boolean){ if (key == NULL) return FALSE; DWORD type, size; if (RegQueryValueEx(key, (char *)(const char *)value, NULL, &type, NULL, &size) != ERROR_SUCCESS) return FALSE; switch (type) { case REG_BINARY : if (size > sizeof(DWORD)) return FALSE; num = 0; // Do REG_DWORD case case REG_DWORD : return RegQueryValueEx(key, (char *)(const char *)value, NULL, &type, (LPBYTE)&num, &size) == ERROR_SUCCESS; case REG_SZ : { PString str; if (RegQueryValueEx(key, (char *)(const char *)value, NULL, &type, (LPBYTE)str.GetPointer(size), &size) == ERROR_SUCCESS) { num = str.AsInteger(); if (num == 0 && boolean) { int c = toupper(str[0]); num = c == 'T' || c == 'Y'; } return TRUE; } break; } default : PAssertAlways("Unsupported registry type."); } return FALSE;}BOOL RegistryKey::SetValue(const PString & value, const PString & str){ if (key == NULL) return FALSE;#ifndef _WIN32_WCE return RegSetValueEx(key, (char *)(const char *)value, 0, REG_SZ, (LPBYTE)(const char *)str, str.GetLength()+1) == ERROR_SUCCESS;#else // CE has only Unicode based API USES_CONVERSION; return RegSetValueEx(key, (char *)(const char *)value, 0, REG_SZ, (LPBYTE) A2T((const char *)str), ( (str.GetLength()+1) * sizeof(TCHAR)/sizeof(char) ) ) == ERROR_SUCCESS;#endif}BOOL RegistryKey::SetValue(const PString & value, DWORD num){ if (key == NULL) return FALSE; return RegSetValueEx(key, (char *)(const char *)value, 0, REG_DWORD, (LPBYTE)&num, sizeof(num)) == ERROR_SUCCESS;}static BOOL IsRegistryPath(const PString & path){ return (path.Find(LocalMachineStr) == 0 && path != LocalMachineStr) || (path.Find(CurrentUserStr) == 0 && path != CurrentUserStr);}///////////////////////////////////////////////////////////////////////////////PString PProcess::GetConfigurationFile(){ // No paths set, use defaults if (configurationPaths.IsEmpty()) { configurationPaths.AppendString(executableFile.GetVolume() + executableFile.GetPath()); configurationPaths.AppendString(CurrentUserStr); } // See if explicit filename if (configurationPaths.GetSize() == 1 && !PDirectory::Exists(configurationPaths[0])) return configurationPaths[0]; PString iniFilename = executableFile.GetTitle() + ".INI"; for (PINDEX i = 0; i < configurationPaths.GetSize(); i++) { PString path = configurationPaths[i]; if (IsRegistryPath(path)) return path; PFilePath cfgFile = PDirectory(path) + iniFilename; if (PFile::Exists(cfgFile)) return cfgFile; } return PString();}///////////////////////////////////////////////////////////////////////////////void PConfig::Construct(Source src, const PString & appname, const PString & manuf){ source = Application; switch (src) { case System : if (IsRegistryPath(appname)) location = appname; else { PString dir; GetWindowsDirectory(dir.GetPointer(_MAX_PATH), _MAX_PATH); Construct(PDirectory(dir)+"WIN.INI"); } break; case Application : if (IsRegistryPath(defaultSection)) location = PString(); else { PProcess & proc = PProcess::Current(); PString cfgPath = proc.GetConfigurationFile(); if (IsRegistryPath(cfgPath)) location = cfgPath; else if (!cfgPath) { source = NumSources; // Make a file based config location = cfgPath; } else { location = "SOFTWARE\\"; if (!manuf) location += manuf; else if (!proc.GetManufacturer()) location += proc.GetManufacturer(); else location += "PWLib"; location += PDIR_SEPARATOR; if (appname.IsEmpty()) location += proc.GetName(); else location += appname; location += "\\CurrentVersion\\"; } } break; default : source = src; }}void PConfig::Construct(const PFilePath & filename){ location = filename; source = NumSources;}static void RecurseRegistryKeys(const PString & location, PINDEX baseLength, PStringList §ions){ RegistryKey registry(location, RegistryKey::ReadOnly); PString name; for (PINDEX idx = 0; registry.EnumKey(idx, name); idx++) { RecurseRegistryKeys(location + name + '\\', baseLength, sections); sections.AppendString(location.Mid(baseLength) + name); }}static PString PGetPrivateProfileString(const char * lpAppName, const char * lpKeyName, const char * lpDefault, const char * lpFileName){ PString buffer; DWORD numNulls = lpAppName != NULL && lpKeyName != NULL ? 1 : 2; DWORD size = 100; while (size <= 100000 && ::GetPrivateProfileString(lpAppName, lpKeyName, lpDefault, buffer.GetPointer(size+numNulls), size+numNulls, lpFileName) == size) size *= 10; return buffer;}PStringList PConfig::GetSections() const{ PStringList sections; switch (source) { case Application : RecurseRegistryKeys(location, location.GetLength(), sections); break; case NumSources : PString buffer = PGetPrivateProfileString(NULL, NULL, "", location); char * ptr = buffer.GetPointer(); while (*ptr != '\0') { sections.AppendString(ptr); ptr += strlen(ptr)+1; } break; } return sections;}PStringList PConfig::GetKeys(const PString & section) const{ PStringList keys; switch (source) { case Environment : { char ** ptr = _environ; while (*ptr != NULL) { PString buf = *ptr++; keys.AppendString(buf.Left(buf.Find('='))); } break; } case Application : { PAssert(!section.IsEmpty(), PInvalidParameter); RegistryKey registry(location + section, RegistryKey::ReadOnly); PString name; for (PINDEX idx = 0; registry.EnumValue(idx, name); idx++) keys.AppendString(name); break; } case NumSources : PAssert(!section.IsEmpty(), PInvalidParameter); PString buffer = PGetPrivateProfileString(section, NULL, "", location); char * ptr = buffer.GetPointer(); while (*ptr != '\0') { keys.AppendString(ptr); ptr += strlen(ptr)+1; } } return keys;}void PConfig::DeleteSection(const PString & section){ switch (source) { case Application : { PAssert(!section.IsEmpty(), PInvalidParameter); RegistryKey registry(location, RegistryKey::ReadWrite); registry.DeleteKey(section); break; } case NumSources : PAssert(!section.IsEmpty(), PInvalidParameter); PAssertOS(WritePrivateProfileString(section, NULL, NULL, location)); }}void PConfig::DeleteKey(const PString & section, const PString & key){ switch (source) { case Environment : PAssert(!key.IsEmpty() && key.Find('=') == P_MAX_INDEX, PInvalidParameter); putenv(key + "="); break; case Application : { PAssert(!section.IsEmpty(), PInvalidParameter); RegistryKey registry(location + section, RegistryKey::ReadWrite); registry.DeleteValue(key); break; } case NumSources : PAssert(!key.IsEmpty(), PInvalidParameter); PAssert(!section.IsEmpty(), PInvalidParameter); PAssertOS(WritePrivateProfileString(section, key, NULL, location)); }}BOOL PConfig::HasKey(const PString & section, const PString & key) const{ switch (source) { case Environment : PAssert(!key.IsEmpty(), PInvalidParameter); return getenv(key) != NULL; case Application : { PAssert(!section.IsEmpty(), PInvalidParameter); RegistryKey registry(location + section, RegistryKey::ReadOnly); PString dummy; return registry.QueryValue(key, dummy); } case NumSources : PAssert(!key.IsEmpty() && !section.IsEmpty(), PInvalidParameter); static const char dflt[] = "<<<<<====---PConfig::DefaultValueString---====>>>>>"; return PGetPrivateProfileString(section, key, dflt, location) != dflt; } return FALSE;}PString PConfig::GetString(const PString & section, const PString & key, const PString & dflt) const{ PString str; switch (source) { case Environment : { PAssert(!key.IsEmpty() && key.Find('=') == P_MAX_INDEX, PInvalidParameter); char * env = getenv(key); if (env != NULL) str = env; else str = dflt; break; } case Application : { PAssert(!section.IsEmpty(), PInvalidParameter); RegistryKey registry(location + section, RegistryKey::ReadOnly); if (!registry.QueryValue(key, str)) str = dflt; break; } case NumSources : PAssert(!key.IsEmpty() && !section.IsEmpty(), PInvalidParameter); str = PGetPrivateProfileString(section, key, dflt, location); str.MakeMinimumSize(); } return str;}void PConfig::SetString(const PString & section, const PString & key, const PString & value){ switch (source) { case Environment : PAssert(!key.IsEmpty() && key.Find('=') == P_MAX_INDEX, PInvalidParameter); putenv(key + "=" + value); break; case Application : { PAssert(!section.IsEmpty(), PInvalidParameter); RegistryKey registry(location + section, RegistryKey::Create); registry.SetValue(key, value); break; } case NumSources : PAssert(!key.IsEmpty() && !section.IsEmpty(), PInvalidParameter); PAssertOS(WritePrivateProfileString(section, key, value, location)); }}BOOL PConfig::GetBoolean(const PString & section, const PString & key, BOOL dflt) const{ if (source != Application) { PString str = GetString(section, key, dflt ? "T" : "F").ToUpper(); int c = toupper(str[0]); return c == 'T' || c == 'Y' || str.AsInteger() != 0; } PAssert(!section.IsEmpty(), PInvalidParameter); RegistryKey registry(location + section, RegistryKey::ReadOnly); DWORD value; if (!registry.QueryValue(key, value, TRUE)) return dflt; return value != 0;}void PConfig::SetBoolean(const PString & section, const PString & key, BOOL value){ if (source != Application) SetString(section, key, value ? "True" : "False"); else { PAssert(!section.IsEmpty(), PInvalidParameter); RegistryKey registry(location + section, RegistryKey::Create); registry.SetValue(key, value ? 1 : 0); }}long PConfig::GetInteger(const PString & section, const PString & key, long dflt) const{ if (source != Application) { PString str(PString::Signed, dflt); return GetString(section, key, str).AsInteger(); } PAssert(!section.IsEmpty(), PInvalidParameter); RegistryKey registry(location + section, RegistryKey::ReadOnly); DWORD value; if (!registry.QueryValue(key, value, FALSE)) return dflt; return value;}void PConfig::SetInteger(const PString & section, const PString & key, long value){ if (source != Application) { PString str(PString::Signed, value); SetString(section, key, str); } else { PAssert(!section.IsEmpty(), PInvalidParameter); RegistryKey registry(location + section, RegistryKey::Create); registry.SetValue(key, value); }}// End Of File ///////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -