Share via


데이터베이스 및 패치 예제

애플리케이션은 MsiOpenDatabase 함수를 사용하여 새 또는 기존 설치 데이터베이스(.msi 파일) 또는 패치 패키지(.msp 파일)를 열 수 있습니다. 애플리케이션은 데이터베이스 핸들을 사용하기 전에 MsiOpenDatabase의 반환 값을 확인합니다.

다음 예제에서는 msi.h에 정의된 PMSIHANDLE 형식 변수를 사용합니다. PMSIHANDLE 개체가 범위를 벗어나면 설치 프로그램이 닫히므로 PMSIHANDLE 형식을 사용하는 것이 좋습니다. 반면 애플리케이션은 MsiCloseHandle을 호출하여 MSIHANDLE 개체를 닫아야 합니다. 자세한 내용은 Windows Installer 모범 사례HANDLE 대신 PMSIHANDLE 사용 섹션을 참조하세요.

다음 예제에서는 sample.msi 데이터베이스를 읽기 전용으로 엽니다. MsiOpenDatabase는 c:\test 디렉터리에 sample.msi가 있는 경우에만 성공합니다. 성공하면 반환된 데이터베이스 핸들을 사용하여 MsiDatabaseOpenViewMsiGetSummaryInformation을 사용하여 설치 패키지의 데이터를 쿼리할 수 있습니다.

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;
}