ENH: add functions to API (read, write, delete registry key value)
This commit is contained in:
parent
c7e18a0408
commit
92897bf3a8
|
@ -22,13 +22,21 @@ void CMakeCommandUsage(const char* program)
|
||||||
{
|
{
|
||||||
std::strstream errorStream;
|
std::strstream errorStream;
|
||||||
|
|
||||||
errorStream << "cmake version " << cmMakefile::GetMajorVersion()
|
errorStream
|
||||||
<< "." << cmMakefile::GetMinorVersion() << "\n";
|
<< "cmake version " << cmMakefile::GetMajorVersion()
|
||||||
errorStream << "Usage: " << program << " [command] [arguments ...]\n"
|
<< "." << cmMakefile::GetMinorVersion() << "\n";
|
||||||
<< "Available commands: \n"
|
|
||||||
<< " copy file destination - copy file to destination (either file or directory)\n"
|
errorStream
|
||||||
<< " remove file1 file2 ... - remove the file(s)\n";
|
<< "Usage: " << program << " [command] [arguments ...]\n"
|
||||||
errorStream << std::ends;
|
<< "Available commands: \n"
|
||||||
|
<< " copy file destination - copy file to destination (either file or directory)\n"
|
||||||
|
<< " remove file1 file2 ... - remove the file(s)\n"
|
||||||
|
#if defined(_WIN32) && !defined(__CYGWIN__)
|
||||||
|
<< " write_regv key value - write registry value\n"
|
||||||
|
<< " delete_regv key - delete registry value\n"
|
||||||
|
#endif
|
||||||
|
<< std::ends;
|
||||||
|
|
||||||
cmSystemTools::Error(errorStream.str());
|
cmSystemTools::Error(errorStream.str());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -40,16 +48,19 @@ int main(int ac, char** av)
|
||||||
args.push_back(av[i]);
|
args.push_back(av[i]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if ( args.size() > 1 )
|
if (args.size() > 1)
|
||||||
{
|
{
|
||||||
if ( args[1] == "copy" && args.size() == 4 )
|
// Copy file
|
||||||
|
if (args[1] == "copy" && args.size() == 4)
|
||||||
{
|
{
|
||||||
cmSystemTools::cmCopyFile(args[2].c_str(), args[3].c_str());
|
cmSystemTools::cmCopyFile(args[2].c_str(), args[3].c_str());
|
||||||
return cmSystemTools::GetErrorOccuredFlag();
|
return cmSystemTools::GetErrorOccuredFlag();
|
||||||
}
|
}
|
||||||
if ( args[1] == "remove" && args.size() > 2 )
|
|
||||||
|
// Remove file
|
||||||
|
else if (args[1] == "remove" && args.size() > 2)
|
||||||
{
|
{
|
||||||
for ( std::string::size_type cc = 2; cc < args.size(); cc ++ )
|
for (std::string::size_type cc = 2; cc < args.size(); cc ++)
|
||||||
{
|
{
|
||||||
if(args[cc] != "-f")
|
if(args[cc] != "-f")
|
||||||
{
|
{
|
||||||
|
@ -62,7 +73,24 @@ int main(int ac, char** av)
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#if defined(_WIN32) && !defined(__CYGWIN__)
|
||||||
|
// Write registry value
|
||||||
|
else if (args[1] == "write_regv" && args.size() > 3)
|
||||||
|
{
|
||||||
|
return cmSystemTools::WriteRegistryValue(args[2].c_str(),
|
||||||
|
args[3].c_str()) ? 0 : 1;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Delete registry value
|
||||||
|
else if (args[1] == "delete_regv" && args.size() > 2)
|
||||||
|
{
|
||||||
|
return cmSystemTools::DeleteRegistryValue(args[2].c_str()) ? 0 : 1;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
::CMakeCommandUsage(args[0].c_str());
|
::CMakeCommandUsage(args[0].c_str());
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
|
@ -194,17 +194,17 @@ void cmSystemTools::ReplaceString(std::string& source,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(_WIN32) && !defined(__CYGWIN__)
|
// Read a registry value.
|
||||||
|
|
||||||
// Get the data of key value.
|
|
||||||
// Example :
|
// Example :
|
||||||
// HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\2.1\InstallPath
|
// HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\2.1\InstallPath
|
||||||
// => will return the data of the "default" value of the key
|
// => will return the data of the "default" value of the key
|
||||||
// HKEY_LOCAL_MACHINE\SOFTWARE\Scriptics\Tcl\8.4;Root
|
// HKEY_LOCAL_MACHINE\SOFTWARE\Scriptics\Tcl\8.4;Root
|
||||||
// => will return the data of the "Root" value of the key
|
// => will return the data of the "Root" value of the key
|
||||||
bool ReadAValue(std::string &res, const char *key)
|
|
||||||
|
bool cmSystemTools::ReadRegistryValue(const char *key, std::string &value)
|
||||||
{
|
{
|
||||||
// find the primary key
|
#if defined(_WIN32) && !defined(__CYGWIN__)
|
||||||
|
|
||||||
std::string primary = key;
|
std::string primary = key;
|
||||||
std::string second;
|
std::string second;
|
||||||
std::string valuename;
|
std::string valuename;
|
||||||
|
@ -214,11 +214,13 @@ bool ReadAValue(std::string &res, const char *key)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
size_t valuenamepos = primary.find(";");
|
size_t valuenamepos = primary.find(";");
|
||||||
if (valuenamepos != std::string::npos)
|
if (valuenamepos != std::string::npos)
|
||||||
{
|
{
|
||||||
valuename = primary.substr(valuenamepos+1);
|
valuename = primary.substr(valuenamepos+1);
|
||||||
}
|
}
|
||||||
|
|
||||||
second = primary.substr(start+1, valuenamepos-start-1);
|
second = primary.substr(start+1, valuenamepos-start-1);
|
||||||
primary = primary.substr(0, start);
|
primary = primary.substr(0, start);
|
||||||
|
|
||||||
|
@ -245,8 +247,11 @@ bool ReadAValue(std::string &res, const char *key)
|
||||||
}
|
}
|
||||||
|
|
||||||
HKEY hKey;
|
HKEY hKey;
|
||||||
if(RegOpenKeyEx(primaryKey, second.c_str(),
|
if(RegOpenKeyEx(primaryKey,
|
||||||
0, KEY_READ, &hKey) != ERROR_SUCCESS)
|
second.c_str(),
|
||||||
|
0,
|
||||||
|
KEY_READ,
|
||||||
|
&hKey) != ERROR_SUCCESS)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
@ -255,19 +260,181 @@ bool ReadAValue(std::string &res, const char *key)
|
||||||
DWORD dwType, dwSize;
|
DWORD dwType, dwSize;
|
||||||
dwSize = 1023;
|
dwSize = 1023;
|
||||||
char data[1024];
|
char data[1024];
|
||||||
if(RegQueryValueEx(hKey, (LPTSTR)valuename.c_str(), NULL, &dwType,
|
if(RegQueryValueEx(hKey,
|
||||||
(BYTE *)data, &dwSize) == ERROR_SUCCESS)
|
(LPTSTR)valuename.c_str(),
|
||||||
|
NULL,
|
||||||
|
&dwType,
|
||||||
|
(BYTE *)data,
|
||||||
|
&dwSize) == ERROR_SUCCESS)
|
||||||
{
|
{
|
||||||
if (dwType == REG_SZ)
|
if (dwType == REG_SZ)
|
||||||
{
|
{
|
||||||
res = data;
|
value = data;
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Write a registry value.
|
||||||
|
// Example :
|
||||||
|
// HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\2.1\InstallPath
|
||||||
|
// => will set the data of the "default" value of the key
|
||||||
|
// HKEY_LOCAL_MACHINE\SOFTWARE\Scriptics\Tcl\8.4;Root
|
||||||
|
// => will set the data of the "Root" value of the key
|
||||||
|
|
||||||
|
bool cmSystemTools::WriteRegistryValue(const char *key, const char *value)
|
||||||
|
{
|
||||||
|
#if defined(_WIN32) && !defined(__CYGWIN__)
|
||||||
|
|
||||||
|
std::string primary = key;
|
||||||
|
std::string second;
|
||||||
|
std::string valuename;
|
||||||
|
|
||||||
|
size_t start = primary.find("\\");
|
||||||
|
if (start == std::string::npos)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t valuenamepos = primary.find(";");
|
||||||
|
if (valuenamepos != std::string::npos)
|
||||||
|
{
|
||||||
|
valuename = primary.substr(valuenamepos+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
second = primary.substr(start+1, valuenamepos-start-1);
|
||||||
|
primary = primary.substr(0, start);
|
||||||
|
|
||||||
|
HKEY primaryKey;
|
||||||
|
if (primary == "HKEY_CURRENT_USER")
|
||||||
|
{
|
||||||
|
primaryKey = HKEY_CURRENT_USER;
|
||||||
|
}
|
||||||
|
if (primary == "HKEY_CURRENT_CONFIG")
|
||||||
|
{
|
||||||
|
primaryKey = HKEY_CURRENT_CONFIG;
|
||||||
|
}
|
||||||
|
if (primary == "HKEY_CLASSES_ROOT")
|
||||||
|
{
|
||||||
|
primaryKey = HKEY_CLASSES_ROOT;
|
||||||
|
}
|
||||||
|
if (primary == "HKEY_LOCAL_MACHINE")
|
||||||
|
{
|
||||||
|
primaryKey = HKEY_LOCAL_MACHINE;
|
||||||
|
}
|
||||||
|
if (primary == "HKEY_USERS")
|
||||||
|
{
|
||||||
|
primaryKey = HKEY_USERS;
|
||||||
|
}
|
||||||
|
|
||||||
|
HKEY hKey;
|
||||||
|
DWORD dwDummy;
|
||||||
|
if(RegCreateKeyEx(primaryKey,
|
||||||
|
second.c_str(),
|
||||||
|
0,
|
||||||
|
"",
|
||||||
|
REG_OPTION_NON_VOLATILE,
|
||||||
|
KEY_WRITE,
|
||||||
|
NULL,
|
||||||
|
&hKey,
|
||||||
|
&dwDummy) != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(RegSetValueEx(hKey,
|
||||||
|
(LPTSTR)valuename.c_str(),
|
||||||
|
0,
|
||||||
|
REG_SZ,
|
||||||
|
(CONST BYTE *)value,
|
||||||
|
(DWORD)(strlen(value) + 1)) == ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Delete a registry value.
|
||||||
|
// Example :
|
||||||
|
// HKEY_LOCAL_MACHINE\SOFTWARE\Python\PythonCore\2.1\InstallPath
|
||||||
|
// => will delete the data of the "default" value of the key
|
||||||
|
// HKEY_LOCAL_MACHINE\SOFTWARE\Scriptics\Tcl\8.4;Root
|
||||||
|
// => will delete the data of the "Root" value of the key
|
||||||
|
|
||||||
|
bool cmSystemTools::DeleteRegistryValue(const char *key)
|
||||||
|
{
|
||||||
|
#if defined(_WIN32) && !defined(__CYGWIN__)
|
||||||
|
|
||||||
|
std::string primary = key;
|
||||||
|
std::string second;
|
||||||
|
std::string valuename;
|
||||||
|
|
||||||
|
size_t start = primary.find("\\");
|
||||||
|
if (start == std::string::npos)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
size_t valuenamepos = primary.find(";");
|
||||||
|
if (valuenamepos != std::string::npos)
|
||||||
|
{
|
||||||
|
valuename = primary.substr(valuenamepos+1);
|
||||||
|
}
|
||||||
|
|
||||||
|
second = primary.substr(start+1, valuenamepos-start-1);
|
||||||
|
primary = primary.substr(0, start);
|
||||||
|
|
||||||
|
HKEY primaryKey;
|
||||||
|
if (primary == "HKEY_CURRENT_USER")
|
||||||
|
{
|
||||||
|
primaryKey = HKEY_CURRENT_USER;
|
||||||
|
}
|
||||||
|
if (primary == "HKEY_CURRENT_CONFIG")
|
||||||
|
{
|
||||||
|
primaryKey = HKEY_CURRENT_CONFIG;
|
||||||
|
}
|
||||||
|
if (primary == "HKEY_CLASSES_ROOT")
|
||||||
|
{
|
||||||
|
primaryKey = HKEY_CLASSES_ROOT;
|
||||||
|
}
|
||||||
|
if (primary == "HKEY_LOCAL_MACHINE")
|
||||||
|
{
|
||||||
|
primaryKey = HKEY_LOCAL_MACHINE;
|
||||||
|
}
|
||||||
|
if (primary == "HKEY_USERS")
|
||||||
|
{
|
||||||
|
primaryKey = HKEY_USERS;
|
||||||
|
}
|
||||||
|
|
||||||
|
HKEY hKey;
|
||||||
|
if(RegOpenKeyEx(primaryKey,
|
||||||
|
second.c_str(),
|
||||||
|
0,
|
||||||
|
KEY_WRITE,
|
||||||
|
&hKey) != ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
if(RegDeleteValue(hKey,
|
||||||
|
(LPTSTR)valuename.c_str()) == ERROR_SUCCESS)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
// replace replace with with as many times as it shows up in source.
|
// replace replace with with as many times as it shows up in source.
|
||||||
// write the result into source.
|
// write the result into source.
|
||||||
|
@ -288,7 +455,7 @@ void cmSystemTools::ExpandRegistryValues(std::string& source)
|
||||||
// the arguments are the second match
|
// the arguments are the second match
|
||||||
std::string key = regEntry.match(1);
|
std::string key = regEntry.match(1);
|
||||||
std::string val;
|
std::string val;
|
||||||
if (ReadAValue(val,key.c_str()))
|
if (ReadRegistryValue(key.c_str(), val))
|
||||||
{
|
{
|
||||||
std::string reg = "[";
|
std::string reg = "[";
|
||||||
reg += key + "]";
|
reg += key + "]";
|
||||||
|
@ -305,8 +472,6 @@ void cmSystemTools::ExpandRegistryValues(std::string& source)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
std::string cmSystemTools::EscapeQuotes(const char* str)
|
std::string cmSystemTools::EscapeQuotes(const char* str)
|
||||||
{
|
{
|
||||||
std::string result = "";
|
std::string result = "";
|
||||||
|
|
|
@ -50,6 +50,21 @@ public:
|
||||||
static void ExpandListArguments(std::vector<std::string> const& argsIn,
|
static void ExpandListArguments(std::vector<std::string> const& argsIn,
|
||||||
std::vector<std::string>& argsOut);
|
std::vector<std::string>& argsOut);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read a registry value
|
||||||
|
*/
|
||||||
|
static bool ReadRegistryValue(const char *key, std::string &value);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Write a registry value
|
||||||
|
*/
|
||||||
|
static bool WriteRegistryValue(const char *key, const char *value);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Delete a registry value
|
||||||
|
*/
|
||||||
|
static bool DeleteRegistryValue(const char *key);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Look for and replace registry values in a string
|
* Look for and replace registry values in a string
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue