模块间(dll, exe)使用导出变量、静态变量和外部变量的试验与结论
2011-07-01 10:01
561 查看
// Dll头文件声明
AFX_EXT_DATA int D1_nCount;
extern int D1_nCountE;
static int D1_nCountS = 0;
AFX_EXT_API int D1_GetCount();
// 结论:多模块调用时,或重复调用时,模块内的静态变量是唯一的,不会重复分配内存
int nCount = D1_GetCount();
nCount = D2_GetCount();
nCount = D1_GetCount();
// 结论:dll中声明的静态变量在每个使用的cpp下均有一份拷贝,多模块更是如此(静态变量在编译时会分别拷贝)
nCount = D1_nCountS;
D1_nCountS = 2;
// 结论:dll中声明的外部变量不能用于其他模块,链接失败(基地址都不一样,肯定不行)
nCount = D1_nCountE;
D1_nCountE = 2;
// 结论:dll中导出的数据到处都可以用,在模块内部只有一份拷贝,每个用到的模块各有一份拷贝
nCount = D1_nCount;
D1_nCount = 2;
---- 2008年6月2日
以下后续试验得出了新的结论:
// Dll头文件声明
#ifdef DLL2_EXPORTS
#define D2_API __declspec(dllexport)
#else
#define D2_API __declspec(dllimport)
#endif
D2_API extern int D2_nCount;
// 结论:dll中导出变量在其所在模块为导出,在其他模块必须为导入
// 结论:dll中导出的外部变量到处都可以用,在所有模块中都只有一份拷贝
// 结论:dll中导出的变量到处都可以用,在所有模块中都只有一份拷贝,
// 但是在其所在模块只能包含一次(否则为重定义),所以只能声明为外部变量
nCount = D2_nCount;
D2_nCount = 2;
// 总结论:dll中的变量一般情况下是以函数接口形式导出,
// 但在某些情况下可能需要在模块间直接使用,那么就有两种方法:
// 如果需要该变量在每个模块都有一份拷贝,那么可以使用static声明,
// 不过这种用途一般比较少。。还有就是使用__declspec(dllexport) extern声明,
// 一般都是需要各个模块公用一份拷贝,注意在其他模块使用时需要用
// __declspec(dllexport)导入该变量,否则就又是导出了,而且没有实现
AFX_EXT_DATA int D1_nCount;
extern int D1_nCountE;
static int D1_nCountS = 0;
AFX_EXT_API int D1_GetCount();
// 结论:多模块调用时,或重复调用时,模块内的静态变量是唯一的,不会重复分配内存
int nCount = D1_GetCount();
nCount = D2_GetCount();
nCount = D1_GetCount();
// 结论:dll中声明的静态变量在每个使用的cpp下均有一份拷贝,多模块更是如此(静态变量在编译时会分别拷贝)
nCount = D1_nCountS;
D1_nCountS = 2;
// 结论:dll中声明的外部变量不能用于其他模块,链接失败(基地址都不一样,肯定不行)
nCount = D1_nCountE;
D1_nCountE = 2;
// 结论:dll中导出的数据到处都可以用,在模块内部只有一份拷贝,每个用到的模块各有一份拷贝
nCount = D1_nCount;
D1_nCount = 2;
---- 2008年6月2日
以下后续试验得出了新的结论:
// Dll头文件声明
#ifdef DLL2_EXPORTS
#define D2_API __declspec(dllexport)
#else
#define D2_API __declspec(dllimport)
#endif
D2_API extern int D2_nCount;
// 结论:dll中导出变量在其所在模块为导出,在其他模块必须为导入
// 结论:dll中导出的外部变量到处都可以用,在所有模块中都只有一份拷贝
// 结论:dll中导出的变量到处都可以用,在所有模块中都只有一份拷贝,
// 但是在其所在模块只能包含一次(否则为重定义),所以只能声明为外部变量
nCount = D2_nCount;
D2_nCount = 2;
// 总结论:dll中的变量一般情况下是以函数接口形式导出,
// 但在某些情况下可能需要在模块间直接使用,那么就有两种方法:
// 如果需要该变量在每个模块都有一份拷贝,那么可以使用static声明,
// 不过这种用途一般比较少。。还有就是使用__declspec(dllexport) extern声明,
// 一般都是需要各个模块公用一份拷贝,注意在其他模块使用时需要用
// __declspec(dllexport)导入该变量,否则就又是导出了,而且没有实现
相关文章推荐
- Dll 模块间(dll, exe)使用导出变量、静态变量和外部变量的试验与结论
- Dll 模块间(dll, exe)使用导出变量、静态变量和外部变量的试验与结论
- 【原】模块间(dll, exe)使用导出变量、静态变量和外部变量的试验与结论
- 向自己的模块添加错误代码_使用vc自带的工具MC创建资源并将其添加至DLL或EXE中
- dll中使用exe中的变量
- DLL模块例1:使用.def模块导出函数,规范修饰名称,显示连接调用dll中函数
- 关键技术4:从CVI中导出dll供外部使用
- DLL模块例2:使用__declspec(dllexport)导出函数,extern "C"规范修饰名称,隐式连接调用dll中函数
- 使用 DEF (模块定义) 文件从 DLL 导出函数和类
- c++中使用外部库exe,.dll与.lib文件的生成与使用的详解
- dll 导出类型和变量的区别
- 使用Python将数组的元素导出到变量中(unpacking)
- WinDBG 技巧:列出模块(DLL/EXE)里面所有的符号(symbol)
- static(c中定义的关键字1、被其修饰者 外部无法使用(相反的都可以使用extern在外部使用) 2、函数局部变量使用成为静态的放入静态池-生存期改变。c++进行了扩充,使它在类中有了特殊作用)
- NodeJS模块导出使用
- DLL导出全局变量在多个DLL中调用
- 使用 LIBCTINY.LIB 为 EXE 和 DLL 文件 减肥
- 查看静态库(.lib)和动态库(.dll)的导出函数的信息 error LNK2001: 无法解析的外部符号 _Delete
- AngularJs 如何监视外部变量是否改变? 如何使用$cookieStore保存cookie?
- Python:使用ctypes库调用外部DLL 数据类型对应