DLL中的静态变量
假设定义基类如下:
#include <string>
#include <iostream>
class Base {
public:
static int a;
std::string name = "base";
void print() {
std::cout << name << ": " << a << std::endl;
}
};
int Base::a = 1;
在dll1
中可以返回一个继承类:
#include "../main/base.h"
class DLL1 : public Base {
public:
DLL1() {
name = "dll1";
a = 2;
print();
};
virtual void reset_a(const int& new_a) {
a = new_a;
print();
}
};
extern "C" _declspec(dllexport) Base* create();
#ifdef __cplusplus
extern "C" {
#endif
Base* create()
{
return new DLL1;
}
#ifdef __cplusplus
}
#endif
在dll2
中可以返回一个另一个继承类:
#include "../main/base.h"
class DLL1 : public Base {
public:
DLL1() {
name = "dll2";
a = 3;
print();
};
};
extern "C" _declspec(dllexport) Base* create(); //
#ifdef __cplusplus
extern "C" {
#endif
Base* create()
{
return new DLL1;
}
#ifdef __cplusplus
}
#endif
在主程序中载入dll1
和dll2
,相应输出的结果如下:
#include <iostream>
#include "base.h"
#include <windows.h>
typedef Base* (*Create)();
int main() {
auto dll1_module = LoadLibrary(L"dll1.dll");
Create dll1_create = (Create)GetProcAddress(static_cast<HMODULE>(dll1_module), "create");
Base* dll1_obj = dll1_create(); // dll1: 2
auto dll2_module = LoadLibrary(L"dll2.dll");
auto dll2_create = (Create)GetProcAddress(static_cast<HMODULE>(dll2_module), "create");
Base* dll2_obj = dll2_create(); // dll2: 3
dll1_obj->print(); // d111: 1
dll2_obj->print(); // dll2: 1
dll1_obj->a = 4;
dll1_obj->print(); // dll1: 4
dll2_obj->print(); // dll2: 4
dll1_obj->reset_a(5); // dll1: 5
dll1_obj->print(); // dll1: 4
dll2_obj->print(); // dll2: 4
dll2_obj->reset_a(6); // dll2: 6
dll1_obj->print(); // dll1: 4
dll2_obj->print(); // dll2: 4
getchar();
return 0;
}
这说明Base::a
在程序中出现三个版本,主程序和两个dll
文件中各一个。并且dll中调用的代码使用dll文件的版本,主文件中的代码则调用主文件中的版本。
这样让程序具有非常强的不确定性。因此,在dll
中需特别留意静态变量。