轉散發設定的範例程式碼
[與此頁面相關聯的功能 Windows Media Format 11 SDK是舊版功能。 來源讀取器和接收寫入器已取代它。 來源讀取器和接收寫入器已針對Windows 10和Windows 11進行優化。 Microsoft 強烈建議新程式碼盡可能使用來源讀取器和接收寫入器,而不是Windows 媒體格式 11 SDK。 Microsoft 建議使用舊版 API 的現有程式碼盡可能重寫為使用新的 API。
當您在應用程式中包含轉散發套件時,您可以在安裝常式中叫用轉散發套件時,使用 /Q:A 旗標。 這會隱藏使用者介面 (UI) 。
下列範例程式碼可用於安裝程式常式,以無訊息模式執行轉散發套件,並在電腦必須重新開機時通知您的安裝程式常式。
#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 );
}
相關主題