158 lines
4.0 KiB
C++
158 lines
4.0 KiB
C++
#if !defined(__KTEXTENSIONMODULE_H__)
|
|
#define __KTEXTENSIONMODULE_H__
|
|
|
|
// Description:
|
|
// 类CKTExtensionModule用于管理DLL库的资源,并简化DllMain()
|
|
// 例子:DLL入口函数的简化和声明
|
|
// KT_IMPLEMENT_EXTENSION_MODULE(KTCadUtilityDll);
|
|
// extern "C" int APIENTRY DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
|
|
// {
|
|
// UNREFERENCED_PARAMETER(lpReserved);
|
|
// if (dwReason == DLL_PROCESS_ATTACH)
|
|
// KTCadUtilityDll.AttachInstance(hInstance);
|
|
// else if (dwReason == DLL_PROCESS_DETACH)
|
|
// KTCadUtilityDll.DetachInstance();
|
|
// return 1;
|
|
// }
|
|
// 在使用本模块资源时,可以临时切换到当前资源(要与KT_IMPLEMENT_EXTENSION_MODULE配合)
|
|
// CKTModuleResourceOverride thisResource;
|
|
// Company: Kingtouch Software Corporation. Copyright 2002-2005
|
|
// Author: WangYongguang
|
|
// Date: 2002.05.01
|
|
|
|
|
|
#if _MSC_VER > 1000
|
|
#pragma once
|
|
#endif // _MSC_VER > 1000
|
|
|
|
class CKTModuleResourceOverride;
|
|
|
|
class CKTExtensionModule
|
|
{
|
|
public:
|
|
CKTExtensionModule();
|
|
|
|
BOOL IsAttached();
|
|
HINSTANCE GetDefaultResourceInstance();
|
|
HINSTANCE GetModuleResourceInstance();
|
|
|
|
// Attaches the Extension DLL to MFC and updates the member
|
|
// resource handles. Pass hInst as the module's resources.
|
|
// Returns TRUE on success and FALSE otherwise.
|
|
// On success a corresponding call to DetachInstance() is
|
|
// required before the DLL terminates.
|
|
BOOL AttachInstance(HINSTANCE hInst);
|
|
|
|
// Detaches the Extension DLL from MFC.
|
|
void DetachInstance();
|
|
|
|
|
|
BOOL m_bAttached;
|
|
HINSTANCE m_hDefaultResource;
|
|
HINSTANCE m_hModuleResource;
|
|
AFX_EXTENSION_MODULE m_module;
|
|
|
|
friend class CKTModuleResourceOverride;
|
|
};
|
|
|
|
inline CKTExtensionModule::CKTExtensionModule()
|
|
: m_bAttached(FALSE), m_hDefaultResource(NULL), m_hModuleResource(NULL)
|
|
{
|
|
m_module.bInitialized = FALSE;
|
|
m_module.hModule = NULL;
|
|
m_module.hResource = NULL;
|
|
m_module.pFirstSharedClass = NULL;
|
|
m_module.pFirstSharedFactory = NULL;
|
|
}
|
|
|
|
inline BOOL CKTExtensionModule::IsAttached()
|
|
{
|
|
return m_bAttached;
|
|
}
|
|
|
|
inline HINSTANCE CKTExtensionModule::GetDefaultResourceInstance()
|
|
{
|
|
return m_hDefaultResource;
|
|
}
|
|
|
|
inline HINSTANCE CKTExtensionModule::GetModuleResourceInstance()
|
|
{
|
|
return m_hModuleResource;
|
|
}
|
|
|
|
inline BOOL CKTExtensionModule::AttachInstance(HINSTANCE hInst)
|
|
{
|
|
if (m_bAttached)
|
|
return FALSE;
|
|
|
|
m_bAttached = AfxInitExtensionModule(m_module, hInst);
|
|
if (m_bAttached)
|
|
{
|
|
m_hModuleResource = hInst;
|
|
new CDynLinkLibrary(m_module);
|
|
}
|
|
|
|
return m_bAttached;
|
|
}
|
|
|
|
inline void CKTExtensionModule::DetachInstance()
|
|
{
|
|
if (m_bAttached)
|
|
{
|
|
AfxTermExtensionModule(m_module);
|
|
m_bAttached = FALSE;
|
|
}
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
class CKTModuleResourceOverride
|
|
{
|
|
public:
|
|
CKTModuleResourceOverride();
|
|
CKTModuleResourceOverride(HINSTANCE hInst);
|
|
virtual ~CKTModuleResourceOverride();
|
|
|
|
static CKTExtensionModule& GetExtensionModule();
|
|
|
|
static CKTExtensionModule& m_extensionModule;
|
|
};
|
|
|
|
inline CKTModuleResourceOverride::CKTModuleResourceOverride()
|
|
{
|
|
m_extensionModule.m_hDefaultResource = AfxGetResourceHandle();
|
|
AfxSetResourceHandle(m_extensionModule.m_hModuleResource);
|
|
}
|
|
|
|
inline CKTModuleResourceOverride::CKTModuleResourceOverride(HINSTANCE hInst)
|
|
{
|
|
m_extensionModule.m_hDefaultResource = AfxGetResourceHandle();
|
|
AfxSetResourceHandle(hInst != NULL ? hInst : m_extensionModule.m_hModuleResource);
|
|
}
|
|
|
|
inline CKTModuleResourceOverride::~CKTModuleResourceOverride()
|
|
{
|
|
AfxSetResourceHandle(m_extensionModule.m_hDefaultResource);
|
|
}
|
|
|
|
inline CKTExtensionModule& CKTModuleResourceOverride::GetExtensionModule()
|
|
{
|
|
return m_extensionModule;
|
|
}
|
|
|
|
////////////////////////////////////////////////////////////////////
|
|
|
|
#define KT_DECLARE_EXTENSION_MODULE(exm) \
|
|
extern CKTExtensionModule exm;
|
|
|
|
#define KT_IMPLEMENT_EXTENSION_MODULE(exm) \
|
|
CKTExtensionModule exm; \
|
|
CKTExtensionModule& CKTModuleResourceOverride::m_extensionModule = exm;
|
|
|
|
//#define g_hModuleResource CKTModuleResourceOverride::GetExtensionModule().GetModuleResourceInstance()
|
|
|
|
//#define g_hDefaultResource CKTModuleResourceOverride::GetExtensionModule().GetDefaultResourceInstance()
|
|
|
|
|
|
#endif // !defined(__KTEXTENSIONMODULE_H__)
|