PowerRegisterSuspendResumeNotification — предоставленная функция обратного вызова не работает должным образом

Я регистрирую свое приложение, чтобы получать уведомления, когда работа системы приостановлена ​​или возобновлена. документация MSDN

Функция, которую я хотел бы выполнить после того, как приложение получит уведомление (я пробовал как void, так и void CALLBACK, и оба работают одинаково):

void isConnectedStandby()
{
    printf( "ConnectedStandby Request");
}

1-й случай - я предоставляю указатель на функцию isConnectedStandby, но система рассматривает функцию как двойной указатель - она ​​вызывает адрес, который находится под этим указателем обратного вызова.

HPOWERNOTIFY RegistrationHandle;

PowerRegisterSuspendResumeNotification(
      DEVICE_NOTIFY_CALLBACK,
      &isConnectedStandby,
      &RegistrationHandle
);

2-й случай - здесь я предоставляю следующее (таким образом выполняется мой код функции):

typedef void (*StatusFunction_t)(); 
StatusFunction_t StatusFunction = isConnectedStandby;
HPOWERNOTIFY RegistrationHandle;

    PowerRegisterSuspendResumeNotification(
      DEVICE_NOTIFY_CALLBACK,
      &isConnectedStandby,
      &RegistrationHandle
);

Система вызывает не только мою функцию, но и все адреса после первого (если я предоставлю массив функций, он будет выполняться одна за другой, чтобы сбой, когда нет доступного действительного кода)

Как правильно использовать эту функцию?


person dizzer    schedule 09.07.2012    source источник


Ответы (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;
}

Вместо предоставления функции обратного вызова непосредственно PowerRegisterSuspendResumeNotification мы должны предоставить структуру _DEVICE_NOTIFY_SUBSCRIBE_PARAMETERS, заполненную адресом нашей функции:

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

PowerRegisterSuspendResumeNotification(
  DEVICE_NOTIFY_CALLBACK,
  &testCallback,
  &RegistrationHandle
);

В документации MSDN эта информация не упоминается.

person dizzer    schedule 02.08.2012
comment
Обратный вызов не вызывается при входе в режим ожидания с подключением. Он работает только в спящем и обычном режиме ожидания. - person Helge Klein; 15.02.2014