⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wincfg.cxx

📁 pwlib源码库
💻 CXX
📖 第 1 页 / 共 2 页
字号:
  }  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 &sections){  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 + -