2
我想在動態加載的DLL中使用靜態類變量和函數,它們是原始類的子類。這些靜態成員用於靜態鏈接的類;這個類使用工廠加載dll,這些dll應該可以訪問靜態函數和變量。下面是一個簡單的例子作爲一個簡單的演示(即,不要指望它來編譯;實際類各有超過1000線):從動態DLL訪問靜態鏈接庫中的靜態變量/函數
//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類是否屬於此對象的子類?
希望這是足夠清晰的,是有道理的!
基本上,你不能。 DLL並不打算成爲共享數據的手段。 – 2011-04-25 17:35:53
爲什麼不爲您的基礎中的靜態數據提供訪問方法並使數據成員正確保密? 最壞的情況下,只需添加一個「int * getNumInstancesPtr()」給它..雖然它的非封裝非常可怕的做法。根據你的子類想要對數據做什麼,一組更合適的函數可以是incrementInstanceCount()/ decrementInstanceCount()或其他。 – kert 2011-08-11 21:11:00