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