注册表写入失败,看到一网友的回帖,记录在此备忘。
代码在win8,64位系统上刷新注册表显示不出来,是因为它写到了Wow6432Node键所对应的键下。
Microsoft® Windows® 64 位技术白皮书
网址:https://www.microsoft.com/china/ ... cover.mspx?mfr=true
知识:
/*********************************
xp下具体的程序在电脑中的位置位于:
HKEY_LOCAL_MACHINE\SOFTWARE
vista中是位于
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node
如果你在vista64下面依然访问如下位置,
HKEY_LOCAL_MACHINE\SOFTWARE
你得到的其实就是vista下
HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node
的列表。
这其中其实是WOW进行了转换。
*********************************/
直接上代码给你,自己去看了。
typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS) (HANDLE, PBOOL);
LPFN_ISWOW64PROCESS fnIsWow64Process;
BOOL CTestDlg::IsWow64()
{
BOOL bIsWow64 = FALSE;
fnIsWow64Process = (LPFN_ISWOW64PROCESS)GetProcAddress(
GetModuleHandle(TEXT("kernel32")),"IsWow64Process");
if (NULL != fnIsWow64Process)
{
if (!fnIsWow64Process(GetCurrentProcess(),&bIsWow64))
{
// handle error
}
}
return bIsWow64;
}
void CTestDlg::SetSelfRun()
{
HKEY hRoot = HKEY_LOCAL_MACHINE;
HKEY RegKey;
TCHAR szPath[MAX_PATH] = {0};
GetModuleFileName(NULL, szPath, MAX_PATH);
REGSAM flag = KEY_WOW64_64KEY; //加入一个标志就行
/************
typedef ACCESS_MASK REGSAM;
typedef DWORD ACCESS_MASK;
************/
if( RegOpenKeyEx(hRoot ,_T("Software\\Microsoft\\Windows\\CurrentVersion\\Run"), 0, KEY_ALL_ACCESS|flag, &RegKey) != ERROR_SUCCESS )
{
MessageBox(_T("打开失败!"));
return;
}
if ( RegSetValueEx(RegKey, _T("www.baidu.com"), 0, REG_SZ, (const BYTE*)szPath, sizeof(szPath)) != ERROR_SUCCESS )
{
MessageBox(_T("设置自启动失败!"));
return;
}
RegCloseKey(RegKey);
}
void CTestDlg::OnBnClickedBtn()//按钮函数测试成功
{
if (IsWow64())
SetSelfRun();
else
MessageBox(_T("运行在32位操作系统上!"));
}