我在我的代码中遇到一个非常奇怪的问题......我现在整整一个下午都花了很多时间,但却无法获得,也不能获得头脑或尾巴。但也许有人可以指出我做错了什么。
所以解释一下:
我有一个DLL。
在其中我有两个班级:
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&);
};
该类负责映射来自主应用程序的Init / DeInit / Tick函数调用。
其次我有这个:
class DynamicModule {
public:
DynamicModule() : isLoaded(false) { all_modules.push_back(this); }
virtual ~DynamicModule() { }
virtual int OnLoad() { return 0; };
virtual int OnUnload() { return 0; };
private:
static std::vector<DynamicModule*> all_modules;
private: // NO COPY CLASS
DynamicModule(const DynamicModule&);
const DynamicModule& operator=(const DynamicModule&);
};
#define IMPLEMENT_DYNAMICMODULE std::vector<DynamicModule*> DynamicModule::all_modules;
现在在plugin.cpp中我做了:
IMPLEMENT_DYNAMICMODULE;
std::vector<Plugin*> Plugin::all_plugins;
负责静态的东西。
现在我定义一个类(在头文件中):
class InMarket : public Plugin {
public:
int OnInit (ONINIT_PARAMS);
void OnDeInit(ONDEINIT_PARAMS);
int OnTick (ONTICK_PARAMS);
private:
};
并在C ++文件中实现它:
static class InMarket _InMarket;
我跟踪它,并正确调用构造函数。并插入Plugin :: all_plugins。
然后我继续跟踪,我看到了模块(目前有2个模块,例如下一个例子[在C ++文件中定义]):
static class MQL4Trade : public DynamicModule {
public:
virtual int OnLoad() {
__OrderSend = (_OrderSend)GetProcAddress(exe, "OrderSend");
__OrdersCount = (_OrdersCount)GetProcAddress(exe, "OrdersCount");
return 0;
}
} _MQL4Trade;
我看到这些模块也很好地插入到DynamicModule :: all_modules中。 但在我看到这个的同时,我也注意到插件:: all_plugins有一个{size = 0}?!
然后当我输入我的OnInit()函数时,我看到all_modules的大小为2,all_plugins = 0.即使所有构造函数都被调用了吗?
我将我的库加载为:
HMODULE plugin = LoadLibrary(pluginFilename.c_str());
所有静态对象构造函数都被调用.... 而且我没有看到两件事之间的任何差异。
这里发生了什么?