#pragma once
// '04.12.15 : 新規作成 (sug)
// '05.01.06 : テンプレート化 (sug)
#include <Msi.h>
#pragma comment (lib, "Msi.lib")
#include <MsiDefs.h>
#include <MsiQuery.h>
/////////////////////////////////////////////////////////////////////////////
// CMsiDatabaseT
template <bool t_bManaged>
class CMsiDatabaseT
{
public:
CMsiDatabaseT()
{
m_hDatabase = 0;
}
CMsiDatabaseT(MSIHANDLE hDatabase)
{
m_hDatabase = hDatabase;
}
virtual ~CMsiDatabaseT()
{
if (t_bManaged && m_hDatabase != 0)
{
this->CloseHandle();
}
}
public:
bool IsValid()
{
if (m_hDatabase == 0)
{
return false;
}
return true;
}
public:
void Attach(MSIHANDLE hDatabase)
{
ATLASSERT(m_hDatabase == 0);
ATLASSERT(hDatabase != 0);
m_hDatabase = hDatabase;
}
MSIHANDLE Detach()
{
ATLASSERT(m_hDatabase != 0);
MSIHANDLE hDatabase = m_hDatabase;
m_hDatabase = 0;
return hDatabase;
}
public:
CMsiDatabaseT& operator=(MSIHANDLE hDatabase)
{
m_hDatabase = hDatabase;
return *this;
}
operator MSIHANDLE()
{
return m_hDatabase;
}
public:
UINT CloseHandle()
{
ATLASSERT(m_hDatabase != 0);
MSIHANDLE hDatabase = m_hDatabase;
m_hDatabase = 0;
return ::MsiCloseHandle(hDatabase);
}
// Installer database access functions
public:
UINT OpenView(LPCSTR szQuery, MSIHANDLE* phView)
{
ATLASSERT(m_hDatabase != 0);
return ::MsiDatabaseOpenView(m_hDatabase, szQuery, phView);
}
UINT GetPrimaryKeys(LPCSTR szTableName, MSIHANDLE* phRecord)
{
ATLASSERT(m_hDatabase != 0);
return ::MsiDatabaseGetPrimaryKeys(m_hDatabase, szTableName, phRecord);
}
MSICONDITION IsTablePersistent(LPCSTR szTableName)
{
ATLASSERT(m_hDatabase != 0);
return ::MsiDatabaseIsTablePersistent(m_hDatabase, szTableName);
}
// Summary information stream management functions
public:
UINT GetSummaryInformation(LPCSTR szDatabasePath, UINT uiUpdateCount, MSIHANDLE* phSummaryInfo)
{
ATLASSERT(m_hDatabase != 0);
return ::MsiGetSummaryInformation(m_hDatabase, szDatabasePath, uiUpdateCount, phSummaryInfo);
}
// Installer database management functions
public:
UINT Open(LPCSTR szDatabasePath, LPCSTR szPersist)
{
ATLASSERT(m_hDatabase == 0);
return ::MsiOpenDatabase(szDatabasePath, szPersist, &m_hDatabase);
}
UINT Import(LPCSTR szFolderPath, LPCSTR szFileName)
{
ATLASSERT(m_hDatabase != 0);
return ::MsiDatabaseImport(m_hDatabase, szFolderPath, szFileName);
}
UINT Export(LPCSTR szTableName, LPCSTR szFolderPath, LPCSTR szFileName)
{
ATLASSERT(m_hDatabase != 0);
return ::MsiDatabaseExport(m_hDatabase, szTableName, szFolderPath, szFileName);
}
INT Merge(MSIHANDLE hDatabaseMerge, LPCSTR szTableName)
{
ATLASSERT(m_hDatabase != 0);
return ::MsiDatabaseMerge(m_hDatabase, hDatabaseMerge, szTableName);
}
UINT GenerateTransform(MSIHANDLE hDatabaseReference, LPCSTR szTransformFile, int iReserved1, int iReserved2)
{
ATLASSERT(m_hDatabase != 0);
return ::MsiDatabaseGenerateTransform(m_hDatabase, hDatabaseReference, szTransformFile, iReserved1, iReserved2);
}
UINT ApplyTransform(LPCSTR szTransformFile, int iErrorConditions)
{
ATLASSERT(m_hDatabase != 0);
return ::MsiDatabaseApplyTransform(m_hDatabase, szTransformFile, iErrorConditions);
}
UINT CreateTransformSummaryInfo(MSIHANDLE hDatabaseReference, LPCSTR szTransformFile, int iErrorConditions, int iValidation)
{
ATLASSERT(m_hDatabase != 0);
return ::MsiCreateTransformSummaryInfo(m_hDatabase, hDatabaseReference, szTransformFile, iErrorConditions, iValidation);
}
UINT Commit()
{
ATLASSERT(m_hDatabase != 0);
return ::MsiDatabaseCommit(m_hDatabase);
}
// Functions for rendering UI dialogs from the database representations.
public:
UINT EnableUIPreview(MSIHANDLE* phPreview)
{
ATLASSERT(m_hDatabase != 0);
return ::MsiEnableUIPreview(m_hDatabase, phPreview);
}
public:
MSIHANDLE m_hDatabase;
};
typedef CMsiDatabaseT<false> CMsiDatabaseHandle;
typedef CMsiDatabaseT<true> CMsiDatabase;