Compartir a través de


Cómo una aplicación de instalación de dispositivos comprueba si hay instalaciones de dispositivos en curso

La aplicación de instalación de dispositivos debe determinar si hay otras actividades de instalación de dispositivos en curso antes de realizar sus instalaciones. Para realizar esta determinación, la aplicación de instalación de dispositivos debe llamar a CMP_WaitNoPendingInstallEvents, normalmente con un valor de tiempo de espera cero. Si el valor devuelto de esta función indica que hay otras actividades de instalación pendientes (por ejemplo, el Asistente para nuevo hardware encontrado podría estar activo), la aplicación de instalación del dispositivo debe salir.

Para que la aplicación de instalación de dispositivos sea compatible con plataformas que no admiten CMP_WaitNoPendingInstallEvents, la aplicación debe incluir el código siguiente:

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;
    }
    .
    .
}

El uso de este código se basa en el entorno local que, si una plataforma no admite CMP_WaitNoPendingInstallEvents, la plataforma no inicia AutoRun si las actividades de instalación están en curso.

Para obtener un ejemplo de uso de este código, consulta el paquete de instalación de la tostadora en el subdirectorio src\general\toaster del Kit de controladores de Windows (WDK).