Notes
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de vous connecter ou de modifier des répertoires.
L’accès à cette page nécessite une autorisation. Vous pouvez essayer de modifier des répertoires.
La fonction MsiGetPatchFileList et PatchFiles propriété de l’objet Installer prendre une liste des correctifs Windows Installer (fichiers.msp) et renvoyer une liste de fichiers pouvant être mis à jour par les correctifs. La fonction MsiGetPatchFileList et propriété PatchFiles sont disponibles à partir de Windows Installer 4.0.
Liste des fichiers pouvant être mis à jour
L’exemple suivant montre comment extraire les informations d’applicabilité d’une liste de correctifs Windows Installer (fichiers.msp) à l’aide de MsiGetPatchFileList. La fonction MsiGetPatchFileList fournit le code de produit pour la cible des correctifs et une liste de fichiers .msp délimités par des points-virgules. Cet exemple nécessite l’exécution de Windows Installer 4.0 sur Windows Vista.
#include <windows.h>
#include <stdio.h>
#include <Shellapi.h>
#include <msi.h>
#include <Msiquery.h>
#pragma comment(lib, "msi.lib")
#pragma comment(lib, "shell32.lib")
void CloseMsiHandles(MSIHANDLE* phFileListRec, DWORD dwcFiles);
int __cdecl main()
{
UINT uiRet = ERROR_SUCCESS;
int argc;
WCHAR** argv = CommandLineToArgvW(GetCommandLine(), &argc);
MSIHANDLE *phFileListRec = NULL;
DWORD dwcFiles = 0;
WCHAR* szProductCode = argv[1];
WCHAR* szPatchFileList = argv[2];
if(ERROR_SUCCESS != (uiRet = MsiGetPatchFileList(szProductCode, szPatchFileList, &dwcFiles, &phFileListRec)))
{
printf("MsiGetPatchFileListW(%S, ...) Failed with:%d", szProductCode, uiRet);
return uiRet;
}
DWORD cchBuf = 1;
DWORD cchBufSize = 1;
WCHAR* szBuf = new WCHAR[cchBufSize];
if (!szBuf)
{
printf("Failed to allocate memory");
CloseMsiHandles(phFileListRec, dwcFiles);
return ERROR_OUTOFMEMORY;
}
memset(szBuf, 0, sizeof(WCHAR)*cchBufSize);
for(unsigned int i = 0; i < dwcFiles; i++)
{
cchBuf = cchBufSize;
while(ERROR_MORE_DATA == (uiRet = MsiRecordGetString(phFileListRec[i], 0, szBuf, &cchBuf)))
{
if (szBuf)
delete[] szBuf;
cchBufSize = ++cchBuf;
szBuf = new WCHAR[cchBufSize];
if (!szBuf)
{
printf("Failed to allocate memory");
CloseMsiHandles(phFileListRec, dwcFiles);
return ERROR_OUTOFMEMORY;
}
}
if(uiRet != ERROR_SUCCESS)
{
printf("MsiRecordGetString(phFileListRec[%d] with %d", i, uiRet);
CloseMsiHandles(phFileListRec, dwcFiles);
if (szBuf)
delete[] szBuf;
return uiRet;
}
else
{
printf("File %d:%S\n", i, szBuf);
}
}
CloseMsiHandles(phFileListRec, dwcFiles);
if (szBuf)
delete[] szBuf;
return 0;
}
void CloseMsiHandles(MSIHANDLE* phFileListRec, DWORD dwcFiles)
{
if (!phFileListRec)
return;
for (unsigned int i = 0; i < dwcFiles; i++)
{
if (phFileListRec[i])
MsiCloseHandle(phFileListRec[i]);
}
}
//
L’exemple suivant montre comment extraire les informations d’applicabilité d’une liste de correctifs Windows Installer (fichiers.msp) à l’aide de PatchFiles propriété de l’objet Installer. La propriété PatchFiles fournit le code produit pour la cible des correctifs et une liste de fichiers .msp délimités par des points-virgules. Cet exemple nécessite l’exécution de Windows Installer 4.0 sur Windows Vista.
Dim FileList
Dim installer : Set installer = Nothing
Dim argCount:argCount = Wscript.Arguments.Count
Set installer = Wscript.CreateObject("WindowsInstaller.Installer")
If (argCount > 0) Then
sProdCode = Wscript.Arguments(0)
sPatchPckgPath = Wscript.Arguments(1)
Set FileList = installer.PatchFiles (sProdCode, sPatchPckgPath)
For each File in FileList
Wscript.Echo "Affected file: " & File
Next
Else
Usage
End If
Sub Usage
Wscript.Echo "Windows Installer utility to list files updated by a patch for an installed product" &_
vbNewLine & " 1st argument is the product code (GUID) of an installed product" &_
vbNewLine & " 2nd argument is the list of patches" &_
vbNewLine &_
vbNewLine & "Copyright (C) Microsoft. All rights reserved."
Wscript.Quit 1
End Sub