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

在主程序中载入dll1dll2,相应输出的结果如下:

#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中需特别留意静态变量。

Copyright © zhiqiang.org 2016 all right reserved,powered by Gitbook该文件修订时间: 2016-08-03 01:06:06

results matching ""

    No results matching ""