3

我注册我的应用程序以在系统暂停或恢复时接收通知。 MSDN 文档

我希望在应用程序收到通知后执行的功能(我尝试了 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
);

系统调用不仅是我的函数,而且是第一个函数之后的所有地址(如果我提供一个函数数组,它会在没有可用的有效代码时一个接一个地执行崩溃)

使用此功能的正确方法是什么?

4

1 回答 1

1

函数声明(必须是具有 3 个参数的静态 ULONG,如下所示):

static ULONG isConnectedStandby(PVOID Context, ULONG Type, PVOID Setting);

ULONG isConnectedStandby(PVOID Context, ULONG Type, PVOID Setting)
{
    printf( "ConnectedStandby Request");
    return 0;
}

除了直接向 PowerRegisterSuspendResumeNotification 提供回调函数,我们必须提供 struct _DEVICE_NOTIFY_SUBSCRIBE_PARAMETERS 填充我们的函数地址:

static _DEVICE_NOTIFY_SUBSCRIBE_PARAMETERS testCallback = {
    isConnectedStandby,
    nullptr
    };
HPOWERNOTIFY RegistrationHandle;

PowerRegisterSuspendResumeNotification(
  DEVICE_NOTIFY_CALLBACK,
  &testCallback,
  &RegistrationHandle
);

MSDN 文档没有提到任何这些信息。

于 2012-08-02T10:19:38.663 回答