Win7/Win8 64位编程修改注册表开机启动

时间:2022-09-04 14:12:33

刚开始学习注册表操作的时候,用的是孙鑫的VC++深入详解,里面的各种例程是在Win98环境下运行的。。。

于是我想通过编程写入注册表让自己的程序开机运行,我的第一段代码如下:大致意思就是,向HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Run这个目录写入自己程序的路径,奈何怎么写打开注册表都在这个路径下找不到自己的程序。。。

#define MAX_PATH 1024

WCHAR pFileName[MAX_PATH] = {0};//储存当前主程序路径




DWORD DirectoryLength = GetModuleFileName(NULL, pFileName, MAX_PATH); //获取当前路径


HKEY hKey;
LONG result = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_WRITE, &hKey);
if (result != ERROR_SUCCESS)
{
RegCloseKey(hKey);
AfxMessageBox(_T("设置失败1!"));
return;
}


result = RegSetValueEx(hKey, L"Test", NULL, REG_SZ, (CONST BYTE *)pFileName, 2 * DirectoryLength);
if (result != ERROR_SUCCESS)
{
AfxMessageBox(_T("设置失败2!"));

}

RegCloseKey(hKey);

于是我就看MSDN,意外的发现RegOpenKeyExW这个函数倒数第二个参数有玄机,看说明才知道,开发的时候这个MFC程序是32位的,而系统对于32位程序这种注册表操作,都写在HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Run里面去了,当然开机启动不了了。Win7和Win8的64位把32位程序和64位分开管理了,这个Wow6432Node就是管32位的,HKEY_LOCAL_MACHINE\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Run这个目录是管理64位的,如果你是32位系统这么写没有问题,如果你是64位系统那就不好意思,写进前一个目录里面去了。

正确的做法是,将上面加红色语句换成:

LONG result = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_WRITE | KEY_WOW64_64KEY, &hKey);

测试没有问题,成功写入并实现开机启动。