首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > 编程 >

在Exe跟Dll之间共享变量

2013-03-12 
在Exe和Dll之间共享变量今天解决了我开发的FTL里面一个困扰我很久的Bug,把方法共享一下。首先说明:这不是用

在Exe和Dll之间共享变量

今天解决了我开发的FTL里面一个困扰我很久的Bug,把方法共享一下。

首先说明:这不是用 pragma_data 设置的在多个 Exe 公用同一个DLL时,使用DLL中相同的变量,而是同一个进程的EXE和各个DLL之间共享变量。


背景介绍:

   FTL是本人参考ATL、WTL等开发的一个模版库,其中是我常用到的各种可重用的功能代码(比如日志、线程、线程池、流水线等)。因为全部都是头文件(.h 和内嵌的.hpp),在头文件中通过 __declspec(selectany)  定义了全局变量。但不同的 Exe、Dll 等模块包含了头文件后,会在各个模块内部定义各自的全局变量,从而造成逻辑错误。比如我使用了TLS 来将不同线程的日志写入不同的文件,尽量减少写日志时影响程序性能。因为前面的原因,造成同一个线程在 Exe 和 Dll 中写的日志会被判断成两个文件。

当然,因为大部分的人都不会编写模版库,而是编写DLL库,所以估计大部分人都用不到这种方式。这种方法只能是很难找到龙的屠龙技了在Exe跟Dll之间共享变量


更改方法:通过文件映射的方式,将指定的变量设置为进程内全局。这样,不同的模块,包含同一个文件后,使用的变量就统一了。代码实现起来也比较简单。

以下的代码都写在头文件(.h) 中,业务代码包含头文件后直接使用 g_GlobalShareInfo.GetShareValue().xxxx 即可。

BOOL CALLBACK _FtlGlobalShareInfoInitialize(FTLGlobalShareInfo& rShareInfo){BOOL bRet = TRUE;FTLASSERT(rShareInfo.dwTraceTlsIndex == 0);FTLASSERT(rShareInfo.dwBlockElapseTlsIndex == 0);rShareInfo.dwTraceTlsIndex = TlsAlloc();FTLASSERT(TLS_OUT_OF_INDEXES != rShareInfo.dwTraceTlsIndex);if (TLS_OUT_OF_INDEXES != rShareInfo.dwTraceTlsIndex){TlsSetValue(rShareInfo.dwTraceTlsIndex, NULL);}rShareInfo.dwBlockElapseTlsIndex = TlsAlloc();FTLASSERT(TLS_OUT_OF_INDEXES != rShareInfo.dwBlockElapseTlsIndex);if (TLS_OUT_OF_INDEXES != rShareInfo.dwBlockElapseTlsIndex){TlsSetValue(rShareInfo.dwBlockElapseTlsIndex, NULL);}rShareInfo.nTraceSequenceNumber = 0;rShareInfo.nBlockElapseId = 0;return bRet;}BOOL CALLBACK _FtlGlobalShareInfoFinalize(FTLGlobalShareInfo& rShareInfo){if (TLS_OUT_OF_INDEXES != rShareInfo.dwTraceTlsIndex){//CFFastTrace::CFTFileWriter*FTLASSERT(NULL == TlsGetValue(rShareInfo.dwTraceTlsIndex));//相关的资源必须已经释放TlsFree(rShareInfo.dwTraceTlsIndex);rShareInfo.dwTraceTlsIndex = TLS_OUT_OF_INDEXES;}if (TLS_OUT_OF_INDEXES != rShareInfo.dwBlockElapseTlsIndex){//BlockElapseInfo*FTLASSERT(NULL == TlsGetValue(rShareInfo.dwBlockElapseTlsIndex));//相关的资源必须已经释放TlsFree(rShareInfo.dwBlockElapseTlsIndex);rShareInfo.dwBlockElapseTlsIndex = TLS_OUT_OF_INDEXES;}return TRUE;}


热点排行