从动态dll访问静态链接库中的静态变量/函数

时间:2011-04-25 17:27:37

标签: c++ variables dll static subclass

我试图在动态加载的dll中使用静态类变量和函数,它们是原始类的子类。这些静态成员用于静态链接类;这个类使用工厂加载dll,这些dll应该可以访问静态函数和变量。这是一个简单示例的简短示例(即,不要指望它编译;实际的类每个都有超过1000行):

//GenericBase.h-------------------------
#include "GenericDll.h"
class GenericBase{
public:
   GenericBase()
   {
      mClassA.addInstance(this);
   }
   static int mNumInstances;
   static void DoSomething();
   static void Foo();
   static void LoadDlls();
   set<GenericDll*> mPlugins;
};
//--------------------------------------

//GenericDll.h--------------------------
class GenericDll : public GenericBase
{
    void Function();
};
extern "C" __declspec (dllexport) GenericDll* CreateModule()
{
    GenericDll * module = new GenericDll();
    return module;
}
//--------------------------------------

//GenericBase.cpp-----------------------
void GenericBase::DoSomething()
{
    for (it = mPlugins.begin(); it != mPlugins.end(); it++)
        it->Function();
}
//--------------------------------------

//GenericDll.cpp------------------------
void GenericDll::Function()
{
    mNumInstances++; // mNumInstancesin GenericDll and mNumInstances in
                    // the static linked GenericBase have different
                    // addresses
    cout << &mNumInstances<<endl;

    Foo();          // again, the address Foo() is different in the dll
}
//--------------------------------------

//main.cpp
int main(){
    GenericBase g;
    GenericBase::LoadDlls(); //not shown
    GenericBase::DoSomething();
    cout << &mNumInstances << endl;
}

//Output: these are the addresses of the mNumInstances
>> 00FAC3B0
>> 0F753398
>> 004D3398

因此,整体问题或目标是:如何使静态链接对象的mNumInstances地址相同,以及将该对象子类化的动态加载的dll类?

希望这很清楚,也很有道理!

1 个答案:

答案 0 :(得分:0)

要实现您想要做的事情,您需要将共享(每个DLL复制)静态库作为DLL本身。

将DLL视为更像EXE。

另外,在返回诸如set&lt;&gt;之类的内容时,要非常小心库版本以及编译器和链接器设置。 (无论如何)像对齐,数据类型大小和不同的库实现(包括调试到发布)之类的东西可能意味着运行时错误(如果你很幸运会崩溃)。