Liste des fichiers qui peuvent être mis à jour
la fonction MsiGetPatchFileList et la propriété PatchFiles de l' objet Installer prennent la liste des correctifs Windows Installer (fichiers. msp) et retournent une liste des fichiers qui peuvent être mis à jour par les correctifs. la fonction MsiGetPatchFileList et la propriété PatchFiles sont disponibles à partir de Windows Installer 4,0.
Liste des fichiers qui peuvent être mis à jour
l’exemple suivant montre comment extraire les informations d’applicabilité d’une liste de correctifs de Windows Installer (fichiers. msp) à l’aide de MsiGetPatchFileList. La fonction MsiGetPatchFileList est fournie pour la cible des correctifs et une liste de fichiers. msp délimités par des points-virgules. cet exemple nécessite Windows Installer 4,0 s’exécutant 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 Windows Installer correctifs (fichiers. msp) à l’aide de la propriété PatchFiles de l' objet Installer. La propriété PatchFiles est fournie dans le code de produit de la cible des correctifs et une liste de fichiers. msp délimités par des points-virgules. cet exemple nécessite Windows Installer 4,0 s’exécutant 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