📄 wincfg.cxx
字号:
str = PString(PString::Signed, num);
return TRUE;
}
}
default :
PAssertAlways("Unsupported registry type.");
}
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 + -