#pragma once
// '04.12.21 : 新規作成 (sug)
// '05.01.06 : テンプレート化 (sug)
#include <Msi.h>
#pragma comment (lib, "Msi.lib")
#include <MsiDefs.h>
#include <MsiQuery.h>
/////////////////////////////////////////////////////////////////////////////
// CMsiInstallT
template <bool t_bManaged>
class CMsiInstallT
{
public:
CMsiInstallT()
{
m_hInstall = 0;
}
CMsiInstallT(MSIHANDLE hInstall)
{
m_hInstall = hInstall;
}
virtual ~CMsiInstallT()
{
if (t_bManaged && m_hInstall != 0)
{
this->CloseHandle();
}
}
public:
bool IsValid()
{
if (m_hInstall == 0)
{
return false;
}
return true;
}
public:
void Attach(MSIHANDLE hInstall)
{
ATLASSERT(m_hInstall == 0);
ATLASSERT(hInstall != 0);
m_hInstall = hInstall;
}
MSIHANDLE Detach()
{
ATLASSERT(m_hInstall != 0);
MSIHANDLE hInstall = m_hInstall;
m_hInstall = 0;
return hInstall;
}
public:
CMsiInstallT& operator=(MSIHANDLE hInstall)
{
m_hInstall = hInstall;
return *this;
}
operator MSIHANDLE()
{
return m_hInstall;
}
public:
UINT CloseHandle()
{
ATLASSERT(m_hInstall != 0);
MSIHANDLE hInstall = m_hInstall;
m_hInstall = 0;
return ::MsiCloseHandle(hInstall);
}
public:
MSIHANDLE GetActiveDatabase()
{
ATLASSERT(m_hInstall != 0);
return ::MsiGetActiveDatabase(m_hInstall);
}
UINT SetProperty(LPCSTR szName, LPCSTR szValue)
{
ATLASSERT(m_hInstall != 0);
return ::MsiSetProperty(m_hInstall, szName, szValue);
}
// 未テストです。
#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
UINT GetProperty(LPCSTR szName, CString& strValueBuf)
{
ATLASSERT(m_hInstall != 0);
strValueBuf.Empty();
DWORD dwValueBuff = 0;
UINT nr = ::MsiGetProperty(m_hInstall, szName, _T(""), &dwValueBuff);
if (nr != ERROR_MORE_DATA)
{
return nr;
}
dwValueBuff += 1;
CString strTempBuf;
strTempBuf.GetBufferSetLength(dwValueBuff);
nr = ::MsiGetProperty(m_hInstall, szName, strTempBuf.GetBuffer(), &dwValueBuff);
if (nr != ERROR_SUCCESS)
{
strTempBuf.ReleaseBuffer();
return nr;
}
strTempBuf.ReleaseBuffer();
strValueBuf = strTempBuf;
return nr;
}
#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
UINT GetProperty(LPCSTR szName, LPSTR szValueBuf, DWORD* pcchValueBuf)
{
ATLASSERT(m_hInstall != 0);
return ::MsiGetProperty(m_hInstall, szName, szValueBuf, pcchValueBuf);
}
LANGID GetLanguage()
{
ATLASSERT(m_hInstall != 0);
return ::MsiGetLanguage(m_hInstall);
}
BOOL GetMode(MSIRUNMODE eRunMode)
{
ATLASSERT(m_hInstall != 0);
return ::MsiGetMode(m_hInstall, eRunMode);
}
UINT SetMode(MSIRUNMODE eRunMode, BOOL fState)
{
ATLASSERT(m_hInstall != 0);
return ::MsiSetMode(m_hInstall, eRunMode, fState);
}
UINT FormatRecord(MSIHANDLE hRecord, LPSTR szResultBuf, DWORD* pcchResultBuf)
{
ATLASSERT(m_hInstall != 0);
return ::MsiFormatRecord(m_hInstall, hRecord, szResultBuf, pcchResultBuf);
}
UINT DoAction(LPCSTR szAction)
{
ATLASSERT(m_hInstall != 0);
return ::MsiDoAction(m_hInstall, szAction);
}
UINT Sequence(LPCSTR szTable, INT iSequenceMode)
{
ATLASSERT(m_hInstall != 0);
return ::MsiSequence(m_hInstall, szTable, iSequenceMode);
}
int ProcessMessage(INSTALLMESSAGE eMessageType, MSIHANDLE hRecord)
{
ATLASSERT(m_hInstall != 0);
return ::MsiProcessMessage(m_hInstall, eMessageType, hRecord);
}
MSICONDITION EvaluateCondition(LPCSTR szCondition)
{
ATLASSERT(m_hInstall != 0);
return ::MsiEvaluateCondition(m_hInstall, szCondition);
}
UINT GetFeatureState(LPCSTR szFeature, INSTALLSTATE* piInstalled, INSTALLSTATE* piAction)
{
ATLASSERT(m_hInstall != 0);
return ::MsiGetFeatureState(m_hInstall, szFeature, piInstalled, piAction);
}
UINT SetFeatureState(LPCSTR szFeature, INSTALLSTATE iState)
{
ATLASSERT(m_hInstall != 0);
return ::MsiSetFeatureState(m_hInstall, szFeature, iState);
}
UINT SetFeatureAttributes(LPCSTR szFeature, DWORD dwAttributes)
{
ATLASSERT(m_hInstall != 0);
return ::MsiSetFeatureAttributes(m_hInstall, szFeature, dwAttributes);
}
UINT GetComponentState(LPCSTR szComponent, INSTALLSTATE* piInstalled, INSTALLSTATE* piAction)
{
ATLASSERT(m_hInstall != 0);
return ::MsiGetComponentState(m_hInstall, szComponent, piInstalled, piAction);
}
UINT SetComponentState(LPCSTR szComponent, INSTALLSTATE iState)
{
ATLASSERT(m_hInstall != 0);
return ::MsiSetComponentState(m_hInstall, szComponent, iState);
}
UINT GetFeatureCost(LPCSTR szFeature, MSICOSTTREE iCostTree, INSTALLSTATE iState, INT* piCost)
{
ATLASSERT(m_hInstall != 0);
return ::MsiGetFeatureCost(m_hInstall, szFeature, iCostTree, iState, piCost);
}
UINT EnumComponentCosts(LPCSTR szComponent, DWORD dwIndex, INSTALLSTATE iState, LPSTR szDriveBuf, DWORD* pcchDriveBuf, INT* piCost, INT* piTempCost)
{
ATLASSERT(m_hInstall != 0);
return ::MsiEnumComponentCosts(m_hInstall, szComponent, dwIndex, iState, szDriveBuf, pcchDriveBuf, piCost, piTempCost);
}
UINT SetInstallLevel(int iInstallLevel)
{
ATLASSERT(m_hInstall != 0);
return ::MsiSetInstallLevel(m_hInstall, iInstallLevel);
}
UINT GetFeatureValidStates(LPCSTR szFeature, DWORD* dwInstallStates)
{
ATLASSERT(m_hInstall != 0);
return ::MsiGetFeatureValidStates(m_hInstall, szFeature, dwInstallStates);
}
// 未テストです。
#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
UINT GetSourcePath(LPCSTR szFolder, CString& strPathBuf)
{
ATLASSERT(m_hInstall != 0);
strPathBuf.Empty();
DWORD dwPathBuff = 0;
UINT nr = ::MsiGetSourcePath(m_hInstall, szFolder, _T(""), &dwPathBuff);
if (nr != ERROR_MORE_DATA)
{
return nr;
}
dwPathBuff += 1;
CString strTempBuf;
strTempBuf.GetBufferSetLength(dwPathBuff);
nr = ::MsiGetSourcePath(m_hInstall, szFolder, strTempBuf.GetBuffer(), &dwPathBuff);
if (nr != ERROR_SUCCESS)
{
strTempBuf.ReleaseBuffer();
return nr;
}
strTempBuf.ReleaseBuffer();
strPathBuf = strTempBuf;
return nr;
}
#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
UINT GetSourcePath(LPCSTR szFolder, LPSTR szPathBuf, DWORD* pcchPathBuf)
{
ATLASSERT(m_hInstall != 0);
return ::MsiGetSourcePath(m_hInstall, szFolder, szPathBuf, pcchPathBuf);
}
// 未テストです。
#if defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
UINT GetTargetPath(LPCSTR szFolder, CString& strPathBuf)
{
ATLASSERT(m_hInstall != 0);
strPathBuf.Empty();
DWORD dwPathBuff = 0;
UINT nr = ::MsiGetTargetPath(m_hInstall, szFolder, _T(""), &dwPathBuff);
if (nr != ERROR_MORE_DATA)
{
return nr;
}
dwPathBuff += 1;
CString strTempBuf;
strTempBuf.GetBufferSetLength(dwPathBuff);
nr = ::MsiGetTargetPath(m_hInstall, szFolder, strTempBuf.GetBuffer(), &dwPathBuff);
if (nr != ERROR_SUCCESS)
{
strTempBuf.ReleaseBuffer();
return nr;
}
strTempBuf.ReleaseBuffer();
strPathBuf = strTempBuf;
return nr;
}
#endif // defined(_WTL_USE_CSTRING) || defined(__ATLSTR_H__)
UINT GetTargetPath(LPCSTR szFolder, LPSTR szPathBuf, DWORD* pcchPathBuf)
{
ATLASSERT(m_hInstall != 0);
return ::MsiGetTargetPath(m_hInstall, szFolder, szPathBuf, pcchPathBuf);
}
UINT SetTargetPath(LPCSTR szFolder, LPCSTR szFolderPath)
{
ATLASSERT(m_hInstall != 0);
return ::MsiSetTargetPath(m_hInstall, szFolder, szFolderPath);
}
UINT VerifyDiskSpace()
{
ATLASSERT(m_hInstall != 0);
return ::MsiVerifyDiskSpace(m_hInstall);
}
public:
MSIHANDLE m_hInstall;
};
typedef CMsiInstallT<false> CMsiInstallHandle;
typedef CMsiInstallT<true> CMsiInstall;