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 - 提供的回调函数不能按预期工作的主要内容,如果未能解决你的问题,请参考以下文章