删除包含斜线的密钥使用win apiregistry在Windows或使用Qt

我想实现Path SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\SharedDLLs和密钥名称: C:\Program Files\Common Files\Intel\WirelessCommon\TraceAPI.dll现在我想删除此密钥。 以下是我的尝试。 谢谢阅读。

我已经尝试过与Qt和本地API也。 由于keyname中的斜杠,Qt删除不起作用。 在本地API中,我可以打开密钥,但是当我试图删除密钥时,会出现ERROR_FILE_NOT_FOUND。 我已经尝试了所有可能的组合键和斜线。

 void sharedDlls(QSettings::Format format) { QSettings settings("HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\SharedDLLs", format); HKEY hkey; LONG n = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\SharedDLLs"), 0, KEY_ALL_ACCESS | KEY_WOW64_64KEY, &hkey); foreach (QString subkey, settings.allKeys() ) { //converting to double quoted slashes subkey = subkey.replace("/","\\\\"); if(clean) { // because of a slash it's impossible for qsettings to delete settings.remove(subkey); LONG n = RegDeleteKeyEx(hkey, (LPCWSTR)subkey.utf16(), KEY_WOW64_32KEY, 0); if(n != ERROR_SUCCESS) { qDebug() << GetLastError(); qDebug() << "deleting error" << n; //here is error //ERROR_FILE_NOT_FOUND } } } //now close opened ::RegCloseKey(hkey); } 

Solutions Collecting From Web of "删除包含斜线的密钥使用win apiregistry在Windows或使用Qt"

我找不到我的问题的答案,所以我添加解决方案..如果喜欢它可以给予赏金;)

这是解决方法,而不是确切的解决方案,但我认为它是好的和稳定的。

有两个部分的答案1.处理32重定向2. REG DELETE – 删除包含反斜杠的键

第1部分

运行32
%WINDIR%\ Syswow64资料\ REG.EXE

Run64%windir%\ sysnative \ reg.exe

如果你使用system32,它会重定向到32位的reg从32位应用程序使用,所以请避免使用它。 使用系统性。 或者禁用临时重定向

SysNative仅在有效vista之上

第2部分:这是完整的解决方案(Qt)

 QString reg32 = qgetenv("windir")+"\\SysWOW64\\reg.exe"; QString reg64 = qgetenv("windir")+ "\\sysnative\\reg.exe"; QString command = tr("%1 DELETE \"HKLM\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\SharedDLLs\" /v \"%2\" /f") .arg( is32Bit == true ? reg32 : reg64 ) .arg(key); QProcess *process = new QProcess(this); process->start(command); if (process->waitForStarted()) { process->waitForFinished(); QString l = process->readAllStandardOutput().simplified(); Logger::Log_Info("RegistryCleaner", command); if(l.isEmpty()) Logger::Log_Error("RegistryCleaner", "Try again." ); else Logger::Log_Info("RegistryCleaner", "Successfully done" ); } else qDebug() << process->readAllStandardError().simplified(); delete process;