ATL7のCComModuleの修正バージョン[ATL]

(2003.02.11)
#pragma once
 
 
#include "atlbase.h"
 
 
// ATL7のCComModuleの修正バージョン
//  → AppIDを正しく登録できるように修正
//  → InitLibId()が正しく呼び出されるように修正
template <CLASS class="" T, TBase="CComModule">
class CFixedComModule : public TBase
{
public:
    CFixedComModule()
    {
        T::InitLibId();
    }
    virtual ~CFixedComModule()
    {
    }
 
public:
    // CAtlDllModuleTの関数と互換
    BOOL WINAPI DllMain(DWORD dwReason, LPVOID lpReserved) throw()
    {
        return TBase::DllMain(_AtlBaseModule.GetModuleInstance(), dwReason, lpReserved, NULL, &m_libid);
    }
 
    // CComModuleの同名の関数を便利にしてるだけ
    BOOL WINAPI DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved, _ATL_OBJMAP_ENTRY* pObjMap, const GUID* pLibID = &m_libid)
    {
        return TBase::DllMain(hInstance, dwReason, lpReserved, pObjMap, pLibID);
    }
    HRESULT Init(_ATL_OBJMAP_ENTRY* p, HINSTANCE h, const GUID* plibid = &m_libid)
    {
        return TBase::Init(p, h, plibid);
    }
 
public:
    // CAtlDllModuleT よりコピー
    HRESULT DllRegisterServer(BOOL bRegTypeLib = TRUE) throw()
    {
        // registers object, typelib and all interfaces in typelib
        T* pT = static_cast<T*>(this);
        HRESULT hr = pT->RegisterAppId();
        if (SUCCEEDED(hr))
            hr = pT->RegisterServer(bRegTypeLib);
        return hr;
    }
 
    HRESULT DllUnregisterServer(BOOL bUnRegTypeLib = TRUE) throw()
    {
        T* pT = static_cast<T*>(this);
        HRESULT hr = pT->UnregisterServer(bUnRegTypeLib);
        if (SUCCEEDED(hr))
            hr = pT->UnregisterAppId();
        return hr;
    }
 
public:
    // 独自関数
    // CAtlDllModuleT よりコピー
    //  → 本来は、DLL用のもの。。。
    HRESULT ExeRegisterServer(BOOL bRegTypeLib = TRUE) throw()
    {
        // registers object, typelib and all interfaces in typelib
        T* pT = static_cast<T*>(this);
        HRESULT hr = pT->RegisterAppId();
        if (SUCCEEDED(hr))
            hr = pT->RegisterServer(bRegTypeLib);
        return hr;
    }
 
    HRESULT ExeUnregisterServer(BOOL bUnRegTypeLib = TRUE) throw()
    {
        T* pT = static_cast<T*>(this);
        HRESULT hr = pT->UnregisterServer(bUnRegTypeLib);
        if (SUCCEEDED(hr))
            hr = pT->UnregisterAppId();
        return hr;
    }
 
public:
    // CAtlModuleT よりコピー
    HRESULT RegisterAppId() throw()
    {
        return T::UpdateRegistryAppId(TRUE);
    }
 
    HRESULT UnregisterAppId() throw()
    {
        return T::UpdateRegistryAppId(FALSE);
    }
 
public:
    // CAtlExeModuleT よりコピー
    // Parses the command line and registers/unregisters the rgs file if necessary
    bool ParseCommandLine(LPCTSTR lpCmdLine, HRESULT* pnRetCode) throw()
    {
        *pnRetCode = S_OK;
 
        TCHAR szTokens[] = _T("-/");
 
        T* pT = static_cast<T*>(this);
        LPCTSTR lpszToken = FindOneOf(lpCmdLine, szTokens);
        while (lpszToken != NULL)
        {
            if (WordCmpI(lpszToken, _T("UnregServer"))==0)
            {
                *pnRetCode = pT->UnregisterServer(TRUE);
                if (SUCCEEDED(*pnRetCode))
                    *pnRetCode = pT->UnregisterAppId();
                return false;
            }
 
            // Register as Local Server
            if (WordCmpI(lpszToken, _T("RegServer"))==0)
            {
                *pnRetCode = pT->RegisterAppId();
                if (SUCCEEDED(*pnRetCode))
                    *pnRetCode = pT->RegisterServer(TRUE);
                return false;
            }
 
            lpszToken = FindOneOf(lpszToken, szTokens);
        }
 
        return true;
    }
};
一覧に戻る
© 2003 WAC.com All Right Reserved.