[开源世界]增强版的动态链接库接口导出框架
2013-10-22 10:06
141 查看
参考:
从自动导出动态链接库接口看C++的缺点
更新内容:
1.封装了gDllImportList变量,删除了DllImportAttribute.cpp文件。
2.封装了User32类的全局变量,删除了User32.cpp文件。
更新后的框架只需要一个 DllImportAttribute.h文件,导出函数的文件也只需要一个,减少了文件数量。
从自动导出动态链接库接口看C++的缺点
更新内容:
1.封装了gDllImportList变量,删除了DllImportAttribute.cpp文件。
2.封装了User32类的全局变量,删除了User32.cpp文件。
更新后的框架只需要一个 DllImportAttribute.h文件,导出函数的文件也只需要一个,减少了文件数量。
#pragma once #include <Windows.h> #include <list> using namespace std; /* * DllImportAttribute * 定义加载和卸载动态链接库的接口 */ class DllImportAttribute { public: // 加载动态链接库 virtual BOOL Init() = 0; // 卸载动态链接库 virtual BOOL Uninit() = 0; }; /* * DllImportList * 封装gDllImportList(全局)变量,避免使用cpp文件 */ class DllImportList { protected: static DllImportList* m_pInstance; public: static DllImportList* CreateInstance() { if (m_pInstance == NULL) { m_pInstance = new DllImportList(); } return m_pInstance; } static void DeleteInstance() { if (m_pInstance != NULL) { delete m_pInstance; m_pInstance = NULL; } } list<DllImportAttribute*> gDllImportList; }; DllImportList* DllImportList::m_pInstance = NULL; // 加载所有库,用在程序初始化的地方 inline BOOL DllImportInit() { BOOL bSuccess = TRUE; auto& list = DllImportList::CreateInstance()->gDllImportList; for (auto iter = list.begin(); iter != list.end(); iter++) { bSuccess &= (*iter)->Init(); } return bSuccess; } // 卸载所有库,用在程序退出释放资源的地方 inline BOOL DllImportUninit() { BOOL bSuccess = TRUE; auto& list = DllImportList::CreateInstance()->gDllImportList; for (auto iter = list.begin(); iter != list.end(); iter++) { bSuccess &= (*iter)->Uninit(); } // 别放了删除DllImportList实例 DllImportList::DeleteInstance(); return bSuccess; } /* * DLLIMPORTCLASSBEGIN * 定义CLASS##Dll类的前半部分,主要是库加载、卸载以及封装自身实例(避免使用Cpp文件) * m_nOffPtr :指示变量的位置 */ #define DLLIMPORTCLASSBEGIN(CLASS, DLLPATH) class CLASS##Dll : public DllImportAttribute \ { \ protected: \ HMODULE m_hModule; \ public: \ CLASS##Dll() : m_hModule(NULL) { \ DllImportList::CreateInstance()->gDllImportList.push_back(this); \ } \ virtual BOOL Init() { \ m_hModule = LoadLibraryA(DLLPATH); \ return (m_hModule != NULL); \ } \ virtual BOOL Uninit() { \ BOOL bFreeSuccess = FreeLibrary(m_hModule); \ CLASS##Dll::DeleteInstance(); \ return bFreeSuccess; \ } \ protected: \ static CLASS##Dll* m_pInstance; \ public: \ static CLASS##Dll* CreateInstance() \ { \ if (m_pInstance == NULL) \ { \ m_pInstance = new CLASS##Dll(); \ memset((BYTE*)m_pInstance + offsetof(CLASS##Dll, m_nOffPtr), 0, \ sizeof(CLASS##Dll) - offsetof(CLASS##Dll, m_nOffPtr)); \ } \ return m_pInstance; \ } \ static void DeleteInstance() \ { \ if (m_pInstance != NULL) \ { \ delete m_pInstance; \ m_pInstance = NULL; \ } \ } \ protected: \ int m_nOffPtr; \ /* * FUNCTIONENTRY */ #define FUNCTIONENTRY(ENTRYTYPE, ENTRYPOINT) protected: \ typedef ENTRYTYPE; \ ENTRYPOINT ENTRYPOINT##Ptr; \ public: \ ENTRYPOINT ENTRYPOINT##Func() \ { \ if (ENTRYPOINT##Ptr == NULL) \ { \ ENTRYPOINT##Ptr = (ENTRYPOINT)GetProcAddress(m_hModule, #ENTRYPOINT); \ } \ return ENTRYPOINT##Ptr; \ } \ /* * DLLIMPORTCLASSEND */ #define DLLIMPORTCLASSEND(CLASS) }; \ CLASS##Dll* CLASS##Dll::m_pInstance = CLASS##Dll::CreateInstance(); \ /* * DLLIMPORTCALL */ #define DLLIMPORTCALL(CLASS, ENTRYPOINT) CLASS##Dll::CreateInstance()->ENTRYPOINT##Func()
#pragma once #include "DllImportAttribute.h" DLLIMPORTCLASSBEGIN(User32, "User32.dll") FUNCTIONENTRY(int(WINAPI *MessageBoxA)(HWND, LPCSTR, LPCSTR, UINT), MessageBoxA) DLLIMPORTCLASSEND(User32)
DllImportInit(); DLLIMPORTCALL(User32, MessageBoxA)(NULL, "ad", "ad", MB_OK); DllImportUninit();
相关文章推荐
- [开源世界]从自动导出动态链接库接口看C++的缺点
- 开源接口测试框架之公司应用篇
- 使用structs2开源框架+tomcat开源服务+mysql开源数据库+微信开放接口构建考务信息推送平台
- (初识)世界开源框架之源Netty的世界
- 接口自动化 开源框架学习-supertest
- 【开源java游戏框架libgdx专题】-04-接口介绍及生命周期
- PHP轻量级开源接口框架π
- 二十六、【开源框架】EFW框架Winform前端开发之Grid++Report报表、条形码、Excel导出、图表控件
- 开源免费接口管理平台eoLinker AMS开源版 V3.2.0更新,增加批量导出导入接口功能!
- 支持多版本接口api的开源框架NHVersion
- 接口测试 Http 接口测试框架 (思路 + 实现中 + 开源 + 可能难产)
- 【VC编程技巧】动态链接库☞1.2用模块导出接口
- NHibernate开源框架Cuyahoga学习之数据访问接口的实现
- FriedRing(焦圈)--python的开源自动化性能和接口测试框架
- Android 开源框架Universal-Image-Loader完全解析(二)--- 图片缓存策略详解
- 开源框架搜集
- 开源框架:DBUtils使用详解
- CYQ.Data 数据框架 V3.5 开源版本发布(源码提供下载)
- python 网络爬虫开源框架scrapy
- android(安卓)开源框架