Как реализовать полное уведомление OOBE на c ?

#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
}