#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__)