Files
gjm 164968b62e chore
把非utf8-bom编码的cpp/h文件改为 utf8 bom 编码, msvc识别utf8编码时,如果不是bom格式的,会使用当前cp_oem来解码.
2026-10-04 00:04:20 +08:00

158 lines
4.1 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__)