DLL中的静态被初始化,然后不再被初始化

时间:2016-01-29 23:07:20

标签: c++ dll

我在我的代码中遇到一个非常奇怪的问题......我现在整整一个下午都花了很多时间,但却无法获得,也不能获得头脑或尾巴。但也许有人可以指出我做错了什么。

所以解释一下:

我有一个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());

所有静态对象构造函数都被调用.... 而且我没有看到两件事之间的任何差异。

这里发生了什么?

0 个答案:

没有答案
相关问题