Как узнать, когда начальное перечисление plug and play завершено в Windows

Я пишу службу Windows, которая запускается автоматически. Казалось бы, моя служба запускается до того, как Windows закончит перечисление оборудования; конкретно USB флешки. Можно ли как-то узнать, когда Windows закончит начальное сканирование оборудования? Я почти уверен, что это так, потому что Explorer отобразит подсказку, когда это сканирование определит, что для завершения установки оборудования необходима перезагрузка. Я думал о том, чтобы просто поспать в течение некоторого длительного периода времени. Я бы предпочел найти более элегантное решение. Я разрабатываю Visual Studio 2017 с использованием С++ и ориентируюсь на Windows 7 и Windows 10.


person Daniel Knueven    schedule 26.07.2019    source источник


Ответы (1)


Я не знаю, задерживает ли это мое приложение достаточно долго, чтобы все диски появились, или заставляет диск отображаться. Вот мое решение:

#define _WIN32_WINNT _WIN32_WINNT_WIN7

#include <windows.h>
#include <cfgmgr32.h>
#include <tchar.h>

#pragma comment(lib,"cfgmgr32.lib")

INT _tmain(){

    DEVINST diDevice = 0;

    CONFIGRET crErr = CM_Locate_DevInst(&diDevice,nullptr,CM_LOCATE_DEVNODE_NORMAL);

    if (crErr == CR_SUCCESS){

        crErr = CM_Reenumerate_DevNode(diDevice,CM_REENUMERATE_SYNCHRONOUS);

        if (crErr == CR_SUCCESS){

            _tprintf(TEXT("Finished enum\n"));

        }else{

            _tprintf(TEXT("Enum failed: %u\n"),(UINT)CM_MapCrToWin32Err(crErr,0));

        }

    }else{

        _tprintf(TEXT("Locate failed: %u\n"),(UINT)CM_MapCrToWin32Err(crErr,0));

    }

    return 0;

}
person Daniel Knueven    schedule 30.07.2019