1. “DLL的头文件”是个模糊概念,其实应该包含“DLL模块自己用的头文件”和“给DLL以外的模块用的头文件”,但一般地,通过条件编译开关,都把这两个文件合并在一起。
2. 给DLL以外的模块用的“DLL的头文件”中不要“定义”全局变量,而应该“声明”全局变量。
3. DLL中用的全局变量应该在DLL模块内定义。(无论是DLL的cpp文件或在“DLL模块自己用的头文件”中)
下面给个例子。(例子中将“DLL模块自己用的头文件”和“给DLL以外的模块用的头文件”合并在一起)
A。DLL的cpp文件:(dlltest.cpp)
#define DLL_EXPORT //这是编译DLL模块本身 或编译其他使用者的开关
#include "dlltest.h"
long g_count = 0;
int dllmul(int i, int j) { g_count++; return i*j; }
B。DLL的头文件:(dlltest.h)
#ifndef DLL_TEST
#define DLL_TEST
#ifndef DLL_EXPORT
extern "C" __declspec(dllimport) int dllmul(int i, int j);
extern __declspec(dllimport) long g_count;
#else
extern "C" __declspec(dllexport) int dllmul(int i, int j);
extern __declspec(dllexport) long g_count;
#endif
#endif
C。使用上述DLL的程序
#include "dlltest.h"
#include "stdio.h"
int main(){
printf("The count is %d\n",g_count);
printf("5*6=%d\n",dllmul(5,6));
printf("The count is %d\n",g_count);
getchar();
return 0;
}
最后提醒:如果有多个线程或进程使用你的DLL模块,注意共享变量和共享保护。可以看看Jetfrey Richter写的《Windows核心编程》
全局变量一般都是在cpp中定义的。
例如:
xx.h
extern int number;
xx.cpp
int number = 0;
这样,其他文件包含xx.h就不会报错了