опубликован 02-10-2001 19:32 MSK
Почему-то статическое поле класса в DLL ведет себя как не статическое.
Имеется счетчик экземпляров класса InstanceCount.//чего-то здесь не хватает, но чего именно?
//MyClass.h
#ifdef BUILD_DLL
#define DLLPACK __declspec( dllexport )
#else
#define DLLPACK __declspec( dllimport )
#endif
class DLLPACK MyClass:{
static void *ExistInstance;
static int InstanceCount;
public:
//для первого запроса создается новый экземпляр класса
//для последующих Instance'у присваивается указатель на существующий (ExistInstance)
static int __fastcall QueryInstance(void **Instance);
int __fastcall Release();
};
//MyClass.cpp
int MyClass::InstanceCount=0;
void* MyClass::ExistInstance=NULL;
int __fastcall MyClass::QueryInstance(void **Inst)
{
if (!InstanceCount){
ExistInstance=new MyClass(NULL);
*Inst=ExistInstance;
}
else{
*Inst=ExistInstance;
}
InstanceCount++;
return InstanceCount;
}
int __fastcall MyClass::Release()
{
InstanceCount--;
if (!InstanceCount){
delete ExistInstance;
}
return InstanceCount;
}
Запускаем 1-е приложение использующее данную Dll-ку, создаем два экземпляра
InstanceCount=2 - все нормально.
Но вот запускаем 2-е приложение и для него (статический!)
InstanceCount==0 и QueryInstance
возвращает новый экземпляр класса вместо указателя на уже имеющийся.
Специалисты, помогите разобраться !
Да, и еще : ведь получается что созданный объект будет находиться
в адресном пространстве приложения1 и указатель ExistInstance будет содержать
адрес, корректный именно для приложения1 , а каким образом его корректно
спроецировать на адресное пространство приложения2?