MSIのカスタム・アクション(hInstall)のための単純なラッパクラス

(2005.01.14)
#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;
一覧に戻る
© 2003 WAC.com All Right Reserved.