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)


arrow_upward
0
arrow_downward

Объявление функции (должно быть статическим 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