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