Winows 64位系统下32位程序通过Windows API编程修改注册表实现软件开机启动的问题

刚开始学习注册表操作的时候,参考的是孙鑫老师的《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);

测试没有问题,成功写入并实现应用程序的开机启动,实际操作的时候最好判断一下操作系统的位数再写入注册表。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值