注册表监视问题

netlcx 2008-09-24 02:39:28
我用CeFindFirstRegChange监视注册表的改动,WaitForMultipleObjects等待通知。
然后当我创建了个注册表项的时候,WaitForMultipleObjects返回了一个句柄序号,即监视到了注册表修改。

但是当我用CeRegGetNotificationInfo获取修改信息的时候没有成功。这个函数返回0, 即调用失败,然后用GetLastError返回也是0, 即没有发现错误!

请高手帮帮忙!
谢谢!!
相关代码如下

hChange[0] = CeFindFirstRegChange(HKEY_CLASSES_ROOT, TRUE, REG_NOTIFY_CHANGE_NAME|REG_NOTIFY_CHANGE_LAST_SET);
if (INVALID_HANDLE_VALUE == hChange[0])
{
dw_error = GetLastError();
}
hChange[1] = CeFindFirstRegChange(HKEY_CURRENT_USER, TRUE, REG_NOTIFY_CHANGE_NAME|REG_NOTIFY_CHANGE_LAST_SET);
if (INVALID_HANDLE_VALUE == hChange[1])
{
dw_error = GetLastError();
}
hChange[2] = CeFindFirstRegChange(HKEY_LOCAL_MACHINE, TRUE, REG_NOTIFY_CHANGE_NAME|REG_NOTIFY_CHANGE_LAST_SET);
if (INVALID_HANDLE_VALUE == hChange[2])
{
dw_error = GetLastError();
}
if (0 == dw_error)
{
dwRetCode = WaitForMultipleObjects(NOTIFYNUM, hChange, FALSE, INFINITE);
if (WAIT_FAILED == dwRetCode)
{
dw_error = GetLastError();
}

lRetCode = CeRegGetNotificationInfo(hChange[dwRetCode], 0, NULL, 0, NULL, &dwBytesAvailable);
if (0 == lRetCode) //call function fail.
{
dw_error = GetLastError(); //but no error, dw_error = 0;
}
}
...全文
234 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
netlcx 2008-09-26
  • 打赏
  • 举报
回复
哎,只有弄一大堆的RegistryNotifyWindow了!!!
netlcx 2008-09-25
  • 打赏
  • 举报
回复
lRetCode = RegOpenKeyEx(HKEY_CLASSES_ROOT, NULL, 0, 0, &hKey[0]);
if (ERROR_SUCCESS != lRetCode)
{
}
lRetCode = RegOpenKeyEx(HKEY_CURRENT_USER, NULL, 0, 0, &hKey[1]);
if (ERROR_SUCCESS != lRetCode)
{
}
lRetCode = RegOpenKeyEx(HKEY_LOCAL_MACHINE, NULL, 0, 0, &hKey[2]);
if (ERROR_SUCCESS != lRetCode)
{
}

for (i = 0; i < NOTIFYNUM; i++)
{
hChange[i] = CeFindFirstRegChange(hKey[i], TRUE, REG_NOTIFY_CHANGE_NAME);
if (INVALID_HANDLE_VALUE == hChange[i])
{
dw_error = GetLastError();
}
}


问题依旧。
jinhaijian 2008-09-25
  • 打赏
  • 举报
回复
微软害人呀,写了API,又没写全
comiunknown 2008-09-25
  • 打赏
  • 举报
回复
http://groups.google.com/group/microsoft.public.windowsce.platbuilder/browse_thread/thread/2135353190197526/7747acb76b1db148?show_docid=7747acb76b1db148#

你按下面的做法试验过吗?
The first parameter of CeFindFirstRegChange is a Handle to an open key.
So, you may use RegOpenKeyEx to open a registry and get the Handle as the
first parameter of CeFindFirstRegChange function.
netlcx 2008-09-25
  • 打赏
  • 举报
回复
要是这样的话,就没办法监视整个注册表项了?!
只知道发生了变化,但不知道具体位置!!!郁闷~
RegistryNotifyWindow系列函数只能够监视特定值,不能够监视键。
如果要监视整个注册表不是就没有希望了??。
comiunknown 2008-09-25
  • 打赏
  • 举报
回复
又google了一下,有个eMVP在2007年回复过这个问题,大意说你只可通过CeFindFirstRegChange获知何时注册表发生了变更,但是系统的回调函数不会告诉你到底是哪个键发生了变化,也不会告诉你是哪个程序修改了注册表,你只能自己把要监视的注册表键值先保存下来,一旦CeFindFirstRegChange捕获到注册表发生了变动,你再去重新检查你之前保存的注册表键值,看是不是被其他程序变更了。

我估计他的回复的意思是:微软的CeRegGetNotificationInfo根本就没做完善,估计API里面什么都没写,直接return 0,这种情况我在调用CEDB的API也碰到过。
jinhaijian 2008-09-24
  • 打赏
  • 举报
回复
我也试了很久,CeRegGetNotificationInfo返回都是错误的。
先标记一下

7,655

社区成员

发帖
与我相关
我的任务
社区描述
Windows Phone是微软发布的一款手机操作系统,它将微软旗下的Xbox LIVE游戏、Zune音乐与独特的视频体验整合至手机中。
社区管理员
  • Windows客户端开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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