데이터베이스 및 패치 예제
애플리케이션은 MsiOpenDatabase 함수를 사용하여 새 또는 기존 설치 데이터베이스(.msi 파일) 또는 패치 패키지(.msp 파일)를 열 수 있습니다. 애플리케이션은 데이터베이스 핸들을 사용하기 전에 MsiOpenDatabase 반환 값을 확인합니다.
다음 예제에서는 msi.h에 정의된 PMSIHANDLE 형식 변수를 사용합니다. PMSIHANDLE 형식을 사용하는 것이 좋습니다. 설치 관리자가 범위를 벗어날 때 PMSIHANDLE 개체를 닫는 반면 애플리케이션은 MsiCloseHandle호출하여 MSIHANDLE 개체를 닫아야 합니다. 자세한 내용은 Windows Installer 모범 사례HANDLE 섹션 대신 PMSIHANDLE 사용 참조하세요.
다음 예제에서는 읽기 전용인 sample.msi데이터베이스를 엽니다. MsiOpenDatabase c:\test 디렉터리에 sample.msi 있는 경우에만 성공합니다. 성공하면 반환된 데이터베이스 핸들을 사용하여 MsiDatabaseOpenView 및 MsiGetSummaryInformation사용하여 설치 패키지의 데이터를 쿼리할 수 있습니다.
PMSIHANDLE hDbReadOnly = 0;
UINT uiStatus1 = MsiOpenDatabase(TEXT("c:\\test\\sample.msi"), MSIDBOPEN_READONLY, &hDbReadOnly);
if (ERROR_SUCCESS != uiStatus1)
{
// process error
return uiStatus1;
}
다음 예제에서는 읽고 쓰기 위해 데이터베이스를 엽니다. 애플리케이션이 msiDatabaseCommit호출하는 경우 데이터베이스에 대한 모든 변경 내용이 저장됩니다. 애플리케이션이 msiDatabaseCommit 호출하지 않으면 데이터베이스가 변경되지 않습니다.
PMSIHANDLE hDbTransact = 0;
UINT uiStatus2 = MsiOpenDatabase(TEXT("c:\\test\\example.msi"), MSIDBOPEN_TRANSACT, &hDbTransact);
if (ERROR_SUCCESS != uiStatus2)
{
// process error
return uiStatus2;
}
다음 예제에서는 기존 데이터베이스를 text.msi새 데이터베이스를 만들고 newtest.msi. 변경된 내용은 MsiDatabaseCommit호출하여 새 데이터베이스에 저장할 수 있습니다. szDatabasePath 매개 변수에 지정된 기존 데이터베이스는 변경되지 않습니다.
PMSIHANDLE hDbOutput = 0;
UINT uiStatus3 = MsiOpenDatabase(TEXT("c:\\test\\test.msi"), TEXT("c:\\test\\newtest.msi"), &hDbOutput);
if (ERROR_SUCCESS != uiStatus3)
{
// process error
return uiStatus3;
}
다음 예제에서는 읽기 전용으로 Windows Installer 패치 패키지(.msp 파일)를 엽니다. 반환된 패치 핸들은 _Streams 및 _Storages 테이블에 대한 쿼리를 통해 패치 패키지에 포함된 캐비닛을 결정하고 하위 저장소를 변환하는 데 사용할 수 있습니다.
Windows Installer 2.0: 지원되지 않습니다. Windows Installer 3.0부터 애플리케이션은 새 패치 시퀀싱 정보를 사용하는 패치 패키지에 있는 MsiPatchSequence 테이블을 쿼리할 수 있습니다.
PMSIHANDLE hDbPatch = 0;
LPCTSTR szPersistMode = MSIDBOPEN_READONLY + MSIDBOPEN_PATCHFILE;
UINT uiStatus4 = MsiOpenDatabase(TEXT("c:\\test\\sample.msp"), szPersistMode, &hDbPatch);
if (ERROR_SUCCESS != uiStatus4)
{
// process error
return uiStatus4;
}