Exemple d’API DISM de base
L’API de gestion et de maintenance des images de déploiement (DISM) vous permet de créer des solutions personnalisées sur la plateforme DISM. Vous pouvez utiliser l’API DISM pour installer, désinstaller, configurer et mettre à jour les fonctionnalités, packages et pilotes Windows dans une image Windows.
Exemple d’utilisation des fonctions de base
Cet exemple montre comment utiliser certaines fonctionnalités de base de l'API DISM, notamment l'ouverture d'une session en ligne, l'application d'un appel sans assistance et l'obtention d'informations d'erreur étendues.
#include "windows.h"
#include <stdio.h>
#include "DismApi.h"
int _cdecl wmain()
{
HRESULT hr = S_OK;
HRESULT hrLocal = S_OK;
DismSession session = DISM_SESSION_DEFAULT;
DismSession sessionOnline = DISM_SESSION_DEFAULT;
BOOL bMounted = FALSE;
DismFeatureInfo *pFeatureInfo = NULL;
DismString *pErrorString = NULL;
// Initialize the API
hr = DismInitialize(DismLogErrorsWarningsInfo, L"C:\\MyLogFile.txt", NULL);
if( FAILED(hr))
{
wprintf(L"DismInitialize Failed: %x\n", hr);
goto Cleanup;
}
wprintf(L"Mounting: ");
// Mount a VHD image
hr = DismMountImage(L"C:\\Install.VHD",
L"C:\\MountPath",
1,
NULL,
DismImageIndex,
DISM_MOUNT_READWRITE,
NULL,
NULL,
NULL);
if( FAILED(hr))
{
wprintf(L"\nDismMountImage Failed: %x\n", hr);
goto Cleanup;
}
bMounted = TRUE;
wprintf(L"Complete.\n\n");
// Open a session against the mounted image
hr = DismOpenSession(L"C:\\MountPath",
NULL,
NULL,
&session);
if( FAILED(hr))
{
wprintf(L"DismOpenSession Failed: %x\n", hr);
goto Cleanup;
}
// Apply an unattend file to the offline image
hr = DismApplyUnattend(session,
L"C:\\unattend.xml",
FALSE);
if( FAILED(hr))
{
wprintf(L"DismApplyUnattend Failed: %x\n", hr);
goto Cleanup;
}
// Also open a session against the running operating system (online image)
hr = DismOpenSession(DISM_ONLINE_IMAGE,
NULL,
NULL,
&sessionOnline);
if( FAILED(hr))
{
wprintf(L"DismOpenSession Failed: %x\n", hr);
goto Cleanup;
}
// Get the feature info for a non-existent feature to demonstrate error
// functionality
hr = DismGetFeatureInfo(sessionOnline,
L"ThisIsAFakeFeatureName",
NULL,
DismPackageNone,
&pFeatureInfo);
if( FAILED(hr))
{
wprintf(L"DismGetFeatureInfo Failed: %x\n", hr);
hrLocal = DismGetLastErrorMessage(&pErrorString);
if( FAILED(hrLocal))
{
wprintf(L"DismGetLastErrorMessage Failed: %x\n", hr);
goto Cleanup;
}
else
{
wprintf(L"The last error string was: %s\n", pErrorString->Value);
}
}
Cleanup:
// Delete the memory associated with the objects that were returned.
// pFeatureInfo should be NULL due to the expected failure above, but the
// DismDelete function will still return success in this case.
hrLocal = DismDelete(pFeatureInfo);
if( FAILED(hrLocal))
{
wprintf(L"DismDelete Failed: %x\n", hrLocal);
}
hrLocal = DismDelete(pErrorString);
if( FAILED(hrLocal))
{
wprintf(L"DismDelete Failed: %x\n", hrLocal);
}
// Close the DismSession to free up resources tied to the offline session
hrLocal = DismCloseSession (session);
if( FAILED(hrLocal))
{
wprintf(L"DismCloseSession Failed: %x\n", hrLocal);
}
// Close the DismSession to free up resources tied to the online session
hrLocal = DismCloseSession (sessionOnline);
if( FAILED(hrLocal))
{
wprintf(L"DismCloseSession Failed: %x\n", hrLocal);
}
// Unmount the image if is has been mounted. If the package was successfully added,
// then commit the changes. Otherwise, discard the
// changes
if (bMounted)
{
hrLocal = DismUnmountImage(L"C:\\MountPath",
DISM_DISCARD_IMAGE,
NULL,
NULL,
NULL);
if( FAILED(hrLocal))
{
wprintf(L"DismUnmountImage Failed: %x\n", hrLocal);
}
}
// Shutdown the DISM API to free up remaining resources
hrLocal = DismShutdown();
if( FAILED(hrLocal))
{
wprintf(L"DismShutdown Failed: %x\n", hr);
}
wprintf(L"Return code is: %x\n", hr);
return hr;
}