Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/variables/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/google-app-engine/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 从动态dll访问静态链接库中的静态变量/函数_C++_Variables_Dll_Static_Subclass - Fatal编程技术网

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

C++ 从动态dll访问静态链接库中的静态变量/函数,c++,variables,dll,static,subclass,C++,Variables,Dll,Static,Subclass,我试图在动态加载的dll中使用静态类变量和函数,它们是原始类的子类。这些静态成员在静态链接的类中使用;此类使用工厂加载DLL,这些DLL应该可以访问静态函数和变量。这里有一个简短的示例作为简单的演示,即不要期望它编译;实际的类有1000多行: //GenericBase.h------------------------- #include "GenericDll.h" class GenericBase{ public: GenericBase() { mClassA.

我试图在动态加载的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类(该对象的子类)的mNumInstances地址相同


希望这足够清楚,并且有意义

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

把DLL想象成更像一个EXE


此外,在返回诸如“设置到底是什么”之类的内容时,请非常小心库版本以及编译器和链接器设置,因为要发布的对齐、数据类型大小和不同的库实现可能意味着运行时错误会崩溃(如果幸运的话)。

要实现您想要的操作,您需要将每个DLL的共享复制静态库本身设置为DLL

把DLL想象成更像一个EXE


此外,在返回诸如“设置到底是什么”之类的内容时,请非常小心库版本以及编译器和链接器设置,因为对齐、数据类型大小和要发布的不同库实现可能意味着运行时错误崩溃(如果幸运的话)。

基本上,您不能。DLL不是用来共享数据的。为什么不为数据库中的静态数据提供访问器方法,并使数据成员具有适当的私有性?最坏的情况是,只需添加一个int*getNumInstancesPtr即可。。尽管这是一种可怕的非封装实践。根据您的子类希望对数据执行的操作,更合适的函数集应该是incrementInstanceCount/decrementInstanceCount之类的。基本上,您不能。DLL不是用来共享数据的。为什么不为数据库中的静态数据提供访问器方法,并使数据成员具有适当的私有性?最坏的情况是,只需添加一个int*getNumInstancesPtr即可。。尽管这是一种可怕的非封装实践。根据您的子类对数据的处理方式,更合适的函数集应该是incrementInstanceCount/decrementInstanceCount之类的。。