2011-04-25 126 views
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類是否屬於此對象的子類?

希望這是足夠清晰的,是有道理的!

+1

基本上,你不能。 DLL並不打算成爲共享數據的手段。 – 2011-04-25 17:35:53

+0

爲什麼不爲您的基礎中的靜態數據提供訪問方法並使數據成員正確保密? 最壞的情況下,只需添加一個「int * getNumInstancesPtr()」給它..雖然它的非封裝非常可怕的做法。根據你的子類想要對數據做什麼,一組更合適的函數可以是incrementInstanceCount()/ decrementInstanceCount()或其他。 – kert 2011-08-11 21:11:00

回答

0

爲了實現你想要做的事,你需要使共享(每個DLL複製)靜態庫本身成爲一個DLL。

想象一個DLL更像是一個EXE。如果像對齊,數據類型大小和不同的庫實現(包括調試到釋放)那樣返回類似於集合<>(它永遠是這樣)的東西,可能意味着要非常小心庫版本和編譯器和鏈接器設置運行時錯誤(如果你幸運的話會崩潰)。