3

システムが一時停止または再開されたときに通知を受け取るようにアプリケーションを登録します。 MSDNドキュメント

アプリケーションが通知を受け取った後に実行したい関数(voidとvoid CALLBACKの両方を試しましたが、どちらも同じように機能します):

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

最初のケース-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
);

システムは、関数をマイニングするだけでなく、最初のアドレスの後のすべてのアドレスを呼び出します(関数の配列を提供すると、有効なコードがない場合に次々に実行されてクラッシュします)

この関数を使用する正しい方法は何ですか?

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 に答える