刚开始学习注册表操作的时候,参考的是孙鑫老师的《VC++深入详解》,书里面的各种例程是在Win98环境下演示的。。。
但是我在win8上通过编程写入注册表让自己的程序开机运行出现了问题,参考书中教程,我的第一段代码如下:
#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);
大致意思就是,向HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Run这个目录写入自己程序的路径,奈何怎么写打开注册表都在这个路径下找不到自己的程序。。。
于是我就网上看了一下,发现RegOpenKeyExW这个函数倒数第二个参数有玄机,看API说明才知道,我开发的时候这个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位系统,写入的位置就不是想要的HKEY_LOCAL_MACHINE\\Software\\Microsoft\\Windows\\CurrentVersion\\Run了。
正确的做法是,将上面代码换成:
LONG result = RegOpenKeyExW(HKEY_LOCAL_MACHINE, L"Software\\Microsoft\\Windows\\CurrentVersion\\Run", 0, KEY_WRITE | KEY_WOW64_64KEY, &hKey);
测试没有问题,成功写入并实现应用程序的开机启动,实际操作的时候最好判断一下操作系统的位数再写入注册表。