C++ DLL中的静态数据被初始化,然后不再是静态数据
我在代码中遇到了一个非常奇怪的问题。。。我现在已经花了整整一个下午的时间,对这件事毫无头绪。但也许有人能告诉我我做错了什么 因此,对于解释: 我有一个动态链接库 其中我有两门课:C++ DLL中的静态数据被初始化,然后不再是静态数据,c++,dll,C++,Dll,我在代码中遇到了一个非常奇怪的问题。。。我现在已经花了整整一个下午的时间,对这件事毫无头绪。但也许有人能告诉我我做错了什么 因此,对于解释: 我有一个动态链接库 其中我有两门课: class Plugin { public: Plugin() : isInited(false) { all_plugins.push_back(this); } virtual ~Plugin() { } virtual int OnInit(ONINIT_PARAMS) {
class Plugin {
public:
Plugin() : isInited(false) { all_plugins.push_back(this); }
virtual ~Plugin() { }
virtual int OnInit(ONINIT_PARAMS) { return 0; }
virtual void OnDeInit(ONDEINIT_PARAMS) { }
virtual int OnTick(ONTICK_PARAMS) { return 0; }
private:
static std::vector<Plugin*> all_plugins;
private: // NO COPY CLASS
Plugin(const Plugin&);
const Plugin& operator=(const Plugin&);
};
并在C++文件中实现:
static class InMarket _InMarket;
我跟踪了它,正确地调用了构造函数。并插入Plugin::所有插件
然后继续跟踪,我看到模块(2当前,例如,就像下一个例子中的(C++文件)):
我看到这些模块也很好地插入到DynamicModule::all_模块中。 但同时当我看到这一点时,我也注意到Plugin::all_plugins有一个{size=0} 然后,当我输入OnInit()函数时,我看到所有的\u模块的大小都是2,所有的\u插件都是0。即使所有的构造函数都被调用了 我将我的库加载为:HMODULE plugin = LoadLibrary(pluginFilename.c_str());
所有静态对象构造函数都称为。。。。
我看不出这两件事之间有什么区别
这是怎么回事?每个插件都有自己的all_modules变量。他们无法链接plugin.cpp。必须只有一个,它属于主机。@HansPassant all_modules变量是在DynamicModule中定义的静态变量。至于定义。我只需要把它放在C++文件中的某个地方。我把它放在Plugin.cpp中,当然我可以创建一个DynamicModule.cpp并把它放在那里,但那根本没关系。不?每个插件都有自己的all_modules变量。他们无法链接plugin.cpp。必须只有一个,它属于主机。@HansPassant all_modules变量是在DynamicModule中定义的静态变量。至于定义。我只需要把它放在C++文件中的某个地方。我把它放在Plugin.cpp中,当然我可以创建一个DynamicModule.cpp并把它放在那里,但那根本不重要不?
class InMarket : public Plugin {
public:
int OnInit (ONINIT_PARAMS);
void OnDeInit(ONDEINIT_PARAMS);
int OnTick (ONTICK_PARAMS);
private:
};
static class InMarket _InMarket;
static class MQL4Trade : public DynamicModule {
public:
virtual int OnLoad() {
__OrderSend = (_OrderSend)GetProcAddress(exe, "OrderSend");
__OrdersCount = (_OrdersCount)GetProcAddress(exe, "OrdersCount");
return 0;
}
} _MQL4Trade;
HMODULE plugin = LoadLibrary(pluginFilename.c_str());