RegSetValueEx函数执行失败

lovelynight 2011-12-06 12:31:18
小弟是半路出家的三脚猫,VC算是一知半解吧,想自己做一个电脑锁屏的小软件,实现定时锁屏的功能。

昨天为实现屏蔽任务管理器的功能,找到了这篇文章 http://www.vckbase.com/document/viewdoc/?id=424,作者是用写注册表实现的, 我把源码载了下来, 自己新建了一个2008的MFC 对话框工程,把源码里的TaskKeyHook.h、TaskKeyMgr.cpp、TaskKeyMgr.h、TaskKeyHook.dll、TaskKeyHook.lib 加到自己的工程里面来,调试之后能用,可以实现写注册表,禁用任务管理器。

但是当我按同样的套路把源码里的文件加入到我的锁屏软件的工程里,调用结果却失败了,检查了一下发现问题出在RegSetValueEx()执行失败,返回结果不是ERROR_SUCCESS。但至于为什么失败我就郁郁不得其解了,在前面建立的测试工程里完全可以执行的RegSetValueEx(),为何在锁屏软件的工程就执行失败呢?望有高人解惑,不盛感激!

void CScreenLockDlg::OnBnClickedRadio2()//Disable TaskMgr
{
// TODO: 在此添加控件通知处理程序代码
HKEY hk;
if( ::RegOpenKeyEx(HKCU, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System"), 0, KEY_READ|KEY_WRITE, &hk) )
::RegCreateKeyA(HKCU, "Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System", &hk);

DWORD val=1;
if( ERROR_SUCCESS == RegSetValueEx(hk, _T("DisableTaskMgr"), NULL,REG_SZ, (BYTE*)&val, sizeof(val)) ) //为什么RegSetValueEx失败呢?
{
MessageBox(_T("RegSet Success"));
}
else
{
CString str;
str.Format(_T("%lu"), ERROR_SUCCESS);
MessageBox(str);
}

}

我把完整的工程传到网盘里了,地址是http://www.rayfile.com/zh-cn/files/9f274b91-1fc2-11e1-8654-0015c55db73d/
...全文
905 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
lovelynight 2011-12-06
  • 打赏
  • 举报
回复
找到原因了,着实是让人很无语啊,我系统里装着360,然后运行自己那个程序。本来360会提示一个报警信息,问是不是让程序修改注册表,我先前测试用的工程没有锁屏,能看到这一报警对话框,选择让程序修改注册表就可以了。而现在出问题的这个工程的程序本身是锁屏的,直接把360那个报警信息对话框也屏掉了,360就没有得到允许程序修改的命令…… 所以应该就是360阻止了RegSetValueEx()修改注册表,这也是为什么我在工程里调用成功,却没有执行成功的原因,它从内部看"执行"成功了,却在外部被墙到了。
关了360,问题就解决了,orz.
另感谢回贴的朋友们。
yuucyf 2011-12-06
  • 打赏
  • 举报
回复
会不会是对注册表访问权限不够.
但是你调用RegOpenKeyEx传人KEY_READ|KEY_WRITE都成功,你把该参数改成KEY_ALL_ACCESS试试?
看RegOpenKeyEx是否成功?
lovelynight 2011-12-06
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 waistcoat06 的回复:]
GetLastError查看错误嘛。

[/Quote]
谢谢你的回复,我在else{}里面加了下面的语句
LPVOID lpMsgBuf;
FormatMessage(
FORMAT_MESSAGE_ALLOCATE_BUFFER |
FORMAT_MESSAGE_FROM_SYSTEM |
FORMAT_MESSAGE_IGNORE_INSERTS,
NULL,
GetLastError(),
MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPTSTR) &lpMsgBuf,
0,
NULL
);

// Process any inserts in lpMsgBuf.
// ...

// Display the string.
MessageBox((LPCTSTR)lpMsgBuf);

// Free the buffer.
LocalFree( lpMsgBuf );

得到的显示结果是"操作成功完成。"…… 查看GetLastError()返回值是零……

这就是我最困惑的地方,一个函数莫名其妙的调用失败,费解。
WaistCoat06 2011-12-06
  • 打赏
  • 举报
回复
GetLastError查看错误嘛。

DWORD val=1;
if( ERROR_SUCCESS == RegSetValueEx(hk, _T("DisableTaskMgr"), NULL,REG_SZ, (BYTE*)&val, sizeof(val)) ) //为什么RegSetValueEx失败呢?
{
MessageBox(_T("RegSet Success"));
}
else
{
CString str;
str.Format(_T("%lu"), GetLastError());
MessageBox(str);
}

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧