업데이트할 수 있는 파일 나열
Installer 개체의 MsiGetPatchFileList 함수 및 PatchFiles 속성은 Windows Installer 패치(.msp 파일) 목록을 가져와 패치로 업데이트할 수 있는 파일 목록을 반환합니다. MsiGetPatchFileList 함수 및 PatchFiles 속성은 Windows Installer 4.0부터 사용할 수 있습니다.
업데이트할 수 있는 파일 나열
다음 예제에서는 MsiGetPatchFileList를 사용하여 Windows Installer 패치(.msp 파일) 목록에 대한 적용 가능성 정보를 추출하는 방법을 보여 줍니다. MsiGetPatchFileList 함수는 패치 대상에 대한 제품 코드와 세미콜론으로 구분된 .msp 파일 목록을 제공합니다. 이 예제에는 Windows Vista에서 실행되는 Windows Installer 4.0이 필요합니다.
#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]);
}
}
//
다음 예제에서는 Installer 개체의 PatchFiles를 사용하여 Windows Installer 패치(.msp 파일) 목록에 대한 적용 가능성 정보를 추출하는 방법을 보여 줍니다. PatchFiles 속성은 패치 대상에 대한 제품 코드와 세미콜론으로 구분된 .msp 파일 목록을 제공합니다. 이 예제에는 Windows Vista에서 실행되는 Windows Installer 4.0이 필요합니다.
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