Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
[La característica asociada a esta página, SDK de Windows Media Format 11, es una característica heredada. Se ha reemplazado por lector de origen y receptor escritor. lector de origen y receptor escritor se han optimizado para Windows 10 y Windows 11. Microsoft recomienda encarecidamente que el nuevo código use lector de origen y escritor receptor en lugar de SDK de Windows Media Format 11, siempre que sea posible. Microsoft sugiere que el código existente que usa las API heredadas se reescriba para usar las nuevas API si es posible.
Al incluir el paquete de redistribución en la aplicación, puede usar la marca /Q:A al invocar el paquete de redistribución en la rutina de configuración. Esto suprime la interfaz de usuario (UI).
El código de ejemplo siguiente se puede usar en la rutina de instalación para ejecutar los paquetes de redistribución en modo silencioso y notificar a la rutina de instalación cuando se debe reiniciar el equipo.
#include <windows.h>
#include <shlwapi.h>
#include <TCHAR.H>
// Link to shlwapi.lib.
#pragma comment(lib, "shlwapi")
#define MAX_TIMEOUT_MS 30 * 60 * 1000
#define TIME_INCREMENT 250
// Prototypes
BOOL InstallWMRedist( BOOL );
BOOL SystemNeedsReboot( void );
void main( void )
{
InstallWMRedist( TRUE );
printf("Setup is complete.\n");
if( SystemNeedsReboot() )
{
// Write some code here to ensure that your application will
// restart the computer, delay dll registrations, and so on
// until after the restart, where possible. For example,
// set a global flag for use by the application.
printf("A reboot IS required.");
}
else
{
printf("A reboot IS NOT required...");
}
}
///////////////////////////////////////////////////////////////////////
//
// InstallWMRedist
//
// fWaitForCompletion: If TRUE the function waits for completion.
//
///////////////////////////////////////////////////////////////////////
BOOL InstallWMRedist( BOOL fWaitForCompletion )
{
STARTUPINFO StartUpInfo;
PROCESS_INFORMATION ProcessInfo;
StartUpInfo.cb = sizeof( StartUpInfo );
StartUpInfo.lpReserved = NULL;
StartUpInfo.dwFlags = 0;
StartUpInfo.cbReserved2 = 0;
StartUpInfo.lpReserved2 = NULL;
StartUpInfo.lpDesktop = NULL;
StartUpInfo.lpTitle = NULL;
StartUpInfo.dwX = 0;
StartUpInfo.dwY = 0;
StartUpInfo.dwXSize = 0;
StartUpInfo.dwYSize = 0;
StartUpInfo.dwXCountChars = 0;
StartUpInfo.dwYCountChars = 0;
StartUpInfo.dwFillAttribute = 0;
StartUpInfo.dwFlags = 0;
StartUpInfo.wShowWindow = 0;
StartUpInfo.hStdInput = NULL;
StartUpInfo.hStdOutput = NULL;
StartUpInfo.hStdError = NULL;
// Run the installer with the Quiet for All dialogs and Reboot:Never
// flags. The installation should be silent, and the setup routine
// will be notified about whether the computer must be restarted.
if( !CreateProcess( _T("c:\\temp\\WMFDist.exe"),
_T("c:\\temp\\WMFDist.exe /Q:A"),
NULL, NULL, FALSE, 0, NULL, NULL,
&StartUpInfo, &ProcessInfo ) )
{
DWORD myError = GetLastError();
return( FALSE );
}
CloseHandle( ProcessInfo.hThread );
if( fWaitForCompletion )
{
DWORD dwTimePassed = 0;
while( TRUE )
{
if( WAIT_TIMEOUT != WaitForMultipleObjects( 1,
&ProcessInfo.hProcess,
FALSE, TIME_INCREMENT ) )
break;
if( dwTimePassed > MAX_TIMEOUT_MS )
{
TerminateProcess( ProcessInfo.hProcess, E_FAIL );
break;
}
dwTimePassed += TIME_INCREMENT;
}
}
CloseHandle( ProcessInfo.hProcess);
return( TRUE );
}
///////////////////////////////////////////////////////////////////////
//
// Used to determine whether the system should be restarted.
//
///////////////////////////////////////////////////////////////////////
BOOL SystemNeedsReboot( void )
{
BOOL fNeedExists = FALSE;
OSVERSIONINFO osvi;
osvi.dwOSVersionInfoSize = sizeof( OSVERSIONINFO );
GetVersionEx( &osvi );
if( VER_PLATFORM_WIN32_NT != osvi.dwPlatformId )
{
TCHAR szIniPath[MAX_PATH];
GetWindowsDirectory(szIniPath, sizeof(szIniPath)/sizeof(TCHAR));
// PathAppend automatically inserts a backslash if needed.
PathAppend( szIniPath, _T("wininit.ini") );
if( 0xFFFFFFFF != GetFileAttributes( szIniPath ) )
{
HANDLE hFile = INVALID_HANDLE_VALUE;
hFile = CreateFile(
szIniPath,
GENERIC_READ,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0, NULL
);
if (hFile != INVALID_HANDLE_VALUE)
{
DWORD cbFileSize = GetFileSize(hFile, NULL);
if ((cbFileSize > 0) && (cbFileSize != INVALID_FILE_SIZE))
{
fNeedExists = TRUE;
}
CloseHandle(hFile);
}
}
}
else
{
HKEY hKey = NULL;
if( ERROR_SUCCESS == RegOpenKeyEx( HKEY_LOCAL_MACHINE,
_T("System\\CurrentControlSet\\Control\\Session Manager"),
0, KEY_READ, &hKey ) )
{
if( ERROR_SUCCESS == RegQueryValueEx( hKey,
_T("PendingFileRenameOperations"),
NULL, NULL, NULL, NULL))
{
fNeedExists = TRUE;
}
RegCloseKey( hKey );
}
}
return( fNeedExists );
}
Temas relacionados