WWW.ИСХОДНИКИ.РУ cpp.sources.ru
java.sources.ru web.sources.ru soft.sources.ru
jdbc.sources.ru asp.sources.ru api.sources.ru

  Форум на исходниках
  C / C++ / Visual C++
  еще одна проблема с DLL

СПРОСИТЬ  ОТВЕТИТЬ
профайл | регистрация | faq

Автор Тема:   еще одна проблема с DLL
zAg опубликован 02-10-2001 19:32 MSK   Click Here to See the Profile for zAg   Click Here to Email zAg  
Почему-то статическое поле класса в 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?


migel опубликован 02-10-2001 20:20 MSK     Click Here to See the Profile for migel  Click Here to Email migel     
Так и должно быть при использовании ДЛЛ она всегда мапится в адрессное пространство вызывающего процесса - поэтому и статические поля для каждого процесса свои - если нужно разделить между процессами то делай шаред секцию и туда помещай счетчик.
Корректно можно сделать разделение экземпляров класса -( если нет виртуалных методов то просто- используй отображаемый в память файл) с виртуальными методами - придется извращаться.
zAg опубликован 03-10-2001 17:12 MSK     Click Here to See the Profile for zAg  Click Here to Email zAg     
Вот еще вопросы в связи с вышесказанным:
1. Какой необходим хэндл для CreateFileMapping ? (То есть чем его создать)
Поглядел CreateFile - и оттуда вышел на CreateNamedPipe - правильно ? или может просто CreatePipe...
2. Как определить shared секцию ?
3. А почему могут возникнуть сложности с виртульными функциями ? Казалось бы получили
с помощью MapViewOfFile указатель на объект и спокойно используем , или есть что-то еще ?
migel опубликован 03-10-2001 17:45 MSK     Click Here to See the Profile for migel  Click Here to Email migel     
шаред секция делается так:
// Shared DATA
#pragma data_seg("SHARDATA")
static long g_lSharedData = 0;//MUST BE initialised!
#pragma data_seg()

c виртуальными функциями нельзя работать так как при их вызове используется vtable - естессвенно в другои потоке адреса другие :-) а для простого класса делаеш memcpy всего добра в память (в маппед файл) а в другом потоке можеш просто получить указатель на буфер и привести к нужному классу - только учти что если в классе память выделяется то нужно выделять ее по хитрому - в файл.

zAg опубликован 03-10-2001 18:14 MSK     Click Here to See the Profile for zAg  Click Here to Email zAg     
a..., понятно, но вот все-таки с хэндлом для
CreateFileMapping ( в смысле параметр hFile)как быть ?
zAg опубликован 03-10-2001 18:58 MSK     Click Here to See the Profile for zAg  Click Here to Email zAg     
Кажется сам понял :hFile==INVALID_HANDLE_VALUE, то есть вроде как не нужно никаких pipe'ов
zAg опубликован 04-10-2001 17:16 MSK     Click Here to See the Profile for zAg  Click Here to Email zAg     
Ура !!! Заработало !
migel, спасибо !

Но есть еще вопросы : погляди новый топик - по-моему это интересно.

СПРОСИТЬ  ОТВЕТИТЬ
Перейти:


E-mail | WWW.ИСХОДНИКИ.RU

Powered by: Ultimate Bulletin Board, Freeware Version 5.10a
Purchase our Licensed Version- which adds many more features!
© Infopop Corporation (formerly Madrona Park, Inc.), 1998 - 2000.