#c #c 11
#c #c 11
Вопрос:
Я хочу выполнить win32-реализацию API RegisterWaitUntilOOBECompleted для моего приложения. Цель состоит в том, чтобы обнаружить завершение OOBE и выполнить определенные операции.
Однако я не совсем понимаю, как это реализовать в коде c . Я провел последние 6 часов в поисках примера реализации, но безуспешно. Кто-нибудь может объяснить, как это сделать?
Регистрирует обратный вызов, который будет вызван после завершения OOBE (приветствие Windows).
Синтаксис C
BOOL RegisterWaitUntilOOBECompleted( OOBE_COMPLETED_CALLBACK
OOBECompletedCallback, PVOID CallbackContext,
PVOID *WaitHandle );
Параметры
OOBECompletedCallback
Указатель на определяемую приложением функцию обратного вызова, которая будет вызвана по завершении OOBE. Для получения дополнительной информации см. OOBE_COMPLETED_CALLBACK .
CallbackContext
Указатель на контекст обратного вызова. Это значение будет передано функции, указанной OOBECompletedCallback . Это значение может быть nulll.
WaitHandle
Указатель на переменную, которая получит дескриптор регистрации ожидания обратного вызова.
Комментарии:
1. Это просто функция.
void OobeCompletedCallback(PVOID CallbackContext) { ... }
Если это функция-член, она должна быть статической.CallbackContext
Частоthis
это указатель класса со статической функцией, поэтому вы можете использовать его для вызова функций-членов.2. как насчет WaitHandle? Как это использовать?
3. Используйте его для вызова
UnregisterWaitUntilOOBECompleted
, как указано в документации. «После завершения функции обратного вызова следует вызвать UnregisterWaitUntilOOBECompleted».4. хорошо, понял. Спасибо
Ответ №1:
Для тех, кто в будущем может искать пример реализации этого API, вот как я это сделал. Однако этот пример кода не предназначен для компиляции.
Заголовочный файл
#include "Oobenotification.h"
class MainClass
{
// put constructor here
// destructor
~MainClass();
// OOBE notification
OOBE_COMPLETED_CALLBACK OOBECompletedCallback;
PVOID m_OOBEHandle = NULL;
// receive notification one OOBE complete
void OOBERegisterNotification();
static void CALLBACK NotifyOOBEComplete(PVOID CallbackContext);
public:
Init();
};
CPP-файл
#include "header.h"
void MainClass::~MainClass()
{
if (m_OOBEHandle != NULL)
UnregisterWaitUntilOOBECompleted(m_OOBEHandle);
}
void MainClass::Init()
{
// register to receive oobe complete notification
OOBERegisterNotification();
}
void MainClass::OOBERegisterNotification()
{
OOBECompletedCallback = amp;NotifyOOBEComplete;
BOOL bRes = ::RegisterWaitUntilOOBECompleted(OOBECompletedCallback, NULL, amp;m_OOBEHandle);
if (!bRes)
{
// handle failed registration here
}
}
void CALLBACK MainClass::NotifyOOBEComplete(PVOID Context)
{// async
UNREFERENCED_PARAMETER(Context);
// what you want to do after OOBE
}