PowerRegisterSuspendResumeNotification - 提供的回调函数不能按预期工作
Posted
技术标签:
【中文标题】PowerRegisterSuspendResumeNotification - 提供的回调函数不能按预期工作【英文标题】:PowerRegisterSuspendResumeNotification - provided callback function doesn't work as expected 【发布时间】:2012-07-09 12:02:43 【问题描述】:我注册我的应用程序以在系统暂停或恢复时接收通知。 MSDN documentation
我希望在应用程序收到通知后执行的功能(我尝试了 void 和 void CALLBACK 并且两者的工作方式相同):
void isConnectedStandby()
printf( "ConnectedStandby Request");
第一种情况 - 我提供指向 isConnectedStandby 函数的指针,但系统将其视为指向该函数的双指针 - 它调用此回调指针下的地址。
HPOWERNOTIFY RegistrationHandle;
PowerRegisterSuspendResumeNotification(
DEVICE_NOTIFY_CALLBACK,
&isConnectedStandby,
&RegistrationHandle
);
第二种情况-这里我提供如下(这样我的功能代码就被执行了):
typedef void (*StatusFunction_t)();
StatusFunction_t StatusFunction = isConnectedStandby;
HPOWERNOTIFY RegistrationHandle;
PowerRegisterSuspendResumeNotification(
DEVICE_NOTIFY_CALLBACK,
&isConnectedStandby,
&RegistrationHandle
);
系统不仅调用了我的函数,还调用了第一个函数之后的所有地址(如果我提供了一个函数数组,它会在没有可用的有效代码时一个接一个地执行崩溃)
这个功能的正确使用方法是什么?
【问题讨论】:
【参考方案1】:函数声明(必须是静态 ULONG 3 个参数,如下所示):
static ULONG isConnectedStandby(PVOID Context, ULONG Type, PVOID Setting);
ULONG isConnectedStandby(PVOID Context, ULONG Type, PVOID Setting)
printf( "ConnectedStandby Request");
return 0;
我们必须提供 struct _DEVICE_NOTIFY_SUBSCRIBE_PARAMETERS 来填充我们的函数地址,而不是直接向 PowerRegisterSuspendResumeNotification 提供回调函数:
static _DEVICE_NOTIFY_SUBSCRIBE_PARAMETERS testCallback =
isConnectedStandby,
nullptr
;
HPOWERNOTIFY RegistrationHandle;
PowerRegisterSuspendResumeNotification(
DEVICE_NOTIFY_CALLBACK,
&testCallback,
&RegistrationHandle
);
MSDN 文档没有提及任何这些信息。
【讨论】:
进入连接待机时不调用回调。它仅适用于休眠和正常待机。以上是关于PowerRegisterSuspendResumeNotification - 提供的回调函数不能按预期工作的主要内容,如果未能解决你的问题,请参考以下文章