Partager via


Comment une application d’installation d’appareil vérifie les installations d’appareils en cours

Votre application d’installation d’appareil doit déterminer si d’autres activités d’installation d’appareil sont en cours avant d’effectuer ses installations. Pour effectuer cette détermination, l’application d’installation de l’appareil doit appeler CMP_WaitNoPendingInstallEvents, généralement avec une valeur de délai d’attente zéro. Si la valeur de retour de cette fonction indique que d’autres activités d’installation sont en attente (par exemple, l’Assistant Nouveau matériel trouvé peut être actif), l’application d’installation de l’appareil doit se fermer.

Pour rendre votre application d’installation d’appareil compatible avec les plateformes qui ne prennent pas en charge CMP_WaitNoPendingInstallEvents, l’application doit inclure le code suivant :

BOOL
IsDeviceInstallInProgress (VOID)
{
    HMODULE hModule;
    CMP_WAITNOPENDINGINSTALLEVENTS_PROC pCMP_WaitNoPendingInstallEvents;

    hModule = GetModuleHandle(TEXT("setupapi.dll"));
    if(!hModule)
    {
        // Should never happen since we're linked to SetupAPI, but...
        return FALSE;
    }

    pCMP_WaitNoPendingInstallEvents =
        (CMP_WAITNOPENDINGINSTALLEVENTS_PROC)GetProcAddress(hModule,
                                             "CMP_WaitNoPendingInstallEvents");
    if(!pCMP_WaitNoPendingInstallEvents)
    {
        // We're running on a release of the operating system that doesn't supply this function.
        // Trust the operating system to suppress AutoRun when appropriate.
        return FALSE;
    }
    return (pCMP_WaitNoPendingInstallEvents(0) == WAIT_TIMEOUT);
}

int
__cdecl
_tmain(IN int argc, IN PTCHAR argv[])
{
    if(IsDeviceInstallInProgress()) {
        //
        // We don't want to start right now.  Instead, our
        // device co-installer will invoke this application
        // (if necessary) during finish-install processing.
        //
        return -1;
    }
    .
    .
}

L’utilisation de ce code repose sur le principe que si une plateforme ne prend pas en charge CMP_WaitNoPendingInstallEvents, la plateforme ne démarre pas l’exécution automatique si les activités d’installation sont en cours.

Pour obtenir un exemple d’utilisation de ce code, consultez le package d’installation de grille-pain sous le sous-répertoire src\general\grille-pain du Kit de pilotes Windows (WDK).