为啥我对注册表的更改不保留在 C++ 中?

Posted

技术标签:

【中文标题】为啥我对注册表的更改不保留在 C++ 中?【英文标题】:Why isn't my change to the registry persisting in C++?为什么我对注册表的更改不保留在 C++ 中? 【发布时间】:2009-05-14 16:31:27 【问题描述】:

我正在尝试使用 C++ 编辑注册表,这是我第一次尝试这样做,但我失败了。我没有收到任何错误代码,一切都表明它已成功完成,但实际上并没有更改注册表项。

这是我正在使用的代码:

HKEY hkey;
DWORD dwDisposition, dwType, dwSize;
int autorun = 0x00;
int CD_AUTORUN_DISABLED = 0x20;
long errorCode;
errorCode = RegOpenKeyEx(HKEY_CURRENT_USER, TEXT("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\Explorer"), 0, KEY_ALL_ACCESS, &hkey);

if(errorCode == ERROR_SUCCESS) 
        dwType = REG_DWORD;
        dwSize = sizeof(dwType);
        errorCode = RegQueryValueEx(hkey, TEXT("NoDriveTypeAutoRun"), NULL, &dwType, 
(PBYTE)&autorun, &dwSize);

cout << "Autorun value: " << autorun << endl;
if((autorun & CD_AUTORUN_DISABLED) == 0x20)
        int newAutorun = (autorun - CD_AUTORUN_DISABLED);
        cout << "New value: " << newAutorun  << endl;
        errorCode = RegSetValueEx(hkey, TEXT("NoDriveTypeAutoRun"), 0, dwType, (PBYTE) &autorun, dwSize);
        if(errorCode == ERROR_SUCCESS)
            errorCode = RegCloseKey(hkey);              
            if(errorCode == ERROR_SUCCESS)
                cout << "Value changed." << endl;
            
        else
            cout << "Value change failed, error code: " << errorCode << endl;
        
    else
        cout << "Keep current value." << endl;
    

else
    if(errorCode == ERROR_ACCESS_DENIED)
        cout << "Access denied." << endl;
    else
        cout << "Error! " << errorCode << " : " << ERROR_SUCCESS << endl;
    

我做错了什么?

【问题讨论】:

嘎。我记得几年前遇到过同样的问题,我记得有一些解决方案涉及确保正确关闭某些东西,但我记得不太清楚,无法比现有的更好地指导你...... 实际上,问题在于我没有使用正确的变量。我正在正确关闭钥匙。 【参考方案1】:

您似乎将注册表项设置为您读取的相同值。

int newAutorun = (autorun - CD_AUTORUN_DISABLED);
                cout << "New value: " << newAutorun  << endl;
                errorCode = RegSetValueEx(hkey, TEXT("NoDriveTypeAutoRun"), 0, dwType, (PBYTE) **&autorun**, dwSize);

应该是

int newAutorun = (autorun - CD_AUTORUN_DISABLED);
                cout << "New value: " << newAutorun  << endl;
                errorCode = RegSetValueEx(hkey, TEXT("NoDriveTypeAutoRun"), 0, dwType, (PBYTE) &newAutorun, dwSize);

【讨论】:

【参考方案2】:

我认为是这样的:

errorCode = RegSetValueEx(hkey, TEXT("NoDriveTypeAutoRun"), 0, dwType, (PBYTE) &autorun, dwSize);

应该是这样的:

errorCode = RegSetValueEx(hkey, TEXT("NoDriveTypeAutoRun"), 0, dwType, (PBYTE) &newAutorun, dwSize);

(仔细查看倒数第二个参数)

【讨论】:

【参考方案3】:

尝试改变这个:

errorCode = RegSetValueEx(hkey, TEXT("NoDriveTypeAutoRun"), 0, dwType, (PBYTE) &autorun, dwSize);

到这里:

errorCode = RegSetValueEx(hkey, TEXT("NoDriveTypeAutoRun"), 0, dwType, (PBYTE) &newAutorun, dwSize);

【讨论】:

以上是关于为啥我对注册表的更改不保留在 C++ 中?的主要内容,如果未能解决你的问题,请参考以下文章

使用 C++ 更改注册表值? (系统命令失败)

IDEA修改更改local history本地历史记录保留期 教程

IDEA修改更改local history本地历史记录保留期 教程

C++ 更改 Opera 代理设置

重启后如何使机器人注册反应

为啥 C# 需要注册 COM DLL 才能引用它?