2011-04-25 8 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은 데이터를 공유하는 수단이 아닙니다. –

+0

기지에 정적 데이터에 접근 자 메서드를 제공하고 데이터 멤버를 적절히 비공개로 설정하는 것이 좋습니다. 최악의 경우, "int * getNumInstancesPtr()"을 추가하십시오. 캡슐화가 아닌 끔찍한 방식이지만 말입니다. 하위 클래스가 데이터로 수행하고자하는 작업에 따라 더 적절한 함수 집합이 incrementInstanceCount()/decrementInstanceCount() 또는 무언가가 될 것입니다. – kert

답변

0

원하는 작업을 수행하려면 정적 (DLL 당 복사) 정적 라이브러리를 DLL 자체로 만들어야합니다.

EXE와 비슷한 DLL을 생각해보십시오.

또한 <> 같은 배열을 반환 할 때 라이브러리 버전과 컴파일러 및 링커 설정에주의를 기울여야합니다. 정렬, 데이터 유형 크기 및 다른 라이브러리 구현 (릴리스 디버그)은 런타임 오류 (운이 좋으면 충돌).

관련 문제