Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

DLL и глобальные переменные


KSergey ©   (2009-09-14 11:13:00) 

Есть DLL. В ней есть глобальные переменные.
Она несколько раз подгружается одним процессом.

Вопрос: есть ли волшебный метод сделать так, чтобы глобальные переменные у каждого загруженного экземпляра DLL были свои?
Интересует любой метод, который бы позволил добиться желаемого минимальной модификаций исходников.


Медвежонок Пятачок   (2009-09-15 13:52:00) [1]

да вот хренушки.
речь шла о длл, которая возвратит тебе, скажем экземпляр класса


clickmaker   (2009-09-15 13:31:00) [2]

а чего тут неясного?
"экземпляр класса, который будет создан внутри этой dll. Используй возвращенное числокак некий хендлдля доступа к полям этого класса"
понятно же, что указатель


Медвежонок Пятачок   (2009-09-15 12:49:00) [3]

Тогда надо яснее выражаться, а не пугать людей таким вот:

которая возвратит тебе, скажем экземпляр класса


DVM   (2009-09-15 11:57:00) [4]


> Медвежонок Пятачок ©   (15.09.09 09:09) [8]


> ...... и получишь классические грабли

Никаких граблей не будет. Хост приложение знать не знает о том, что возвращенное ему значение есть на самом деле указатель на экземляр объекта в этой самой DLL. Хост приложению это число нужно исключительно для того, чтобы передавать его в прочие функции DLL. А уже сама DLL будет с этим числом обращаться как с указателем на экземпляр объекта и обращаться по нему к конкретному экземпляру. Да примерно так половина DLL устроена, где есть функция иннициализации, возвращающая некий абстрактный хендл.


Медвежонок Пятачок   (2009-09-15 09:51:00) [5]

хотя если в хост-приложении использовать возвращенное значение как cardinal, а приведение делать в длл, то прокатит


Медвежонок Пятачок   (2009-09-15 09:09:00) [6]

...... и получишь классические грабли


DVM   (2009-09-15 01:30:00) [7]


> KSergey ©

Зачем понадобилась такая ерунда с переменными.
Делай как все нормальные люди.

Заводи в DLL функцию, скажем Init(), которая возвратит тебе, скажем экземпляр класса, который будет создан внутри этой dll. Используй возвращенное число как некий хендл для доступа к полям этого класса (там и будут лежать твои переменные) либо напрямую, либо через вспомогательные функции.


KSergey   (2009-09-14 12:53:00) [8]

> Сергей М. ©   (14.09.09 11:50) [5]

Да есть такое, но моя dll-ка вроде не под разными потоками вызывается (вернее не гарантированно под разными для разных экземпляров), хотя надо уточнить в соседней комнате :)


Сергей М.   (2009-09-14 11:50:00) [9]


> KSergey ©   (14.09.09 11:32) [4]


Но здесь, возможно, будет уместно упомянуть о threadvar


KSergey   (2009-09-14 11:32:00) [10]

> Сергей М. ©   (14.09.09 11:22) [3]
> > Она несколько раз подгружается одним процессом
> Имеется ввиду - одним и тем же  ?

Да.

> > у каждого загруженного экземпляра DLL
> лишено смысла : экземпляр одной и той же DLL в одном и том же процессе всегда один и тот же.

Хм, а ведь и правда. Фигня получается, увы :(
Спасибо.


Сергей М.   (2009-09-14 11:22:00) [11]


> Она несколько раз подгружается одним процессом


Имеется ввиду - одним и тем же  ?

Тогда


> у каждого загруженного экземпляра DLL


лишено смысла : экземпляр одной и той же DLL в одном и том же процессе всегда один и тот же.


Медвежонок Пятачок   (2009-09-14 11:20:00) [12]

Вопрос: есть ли волшебный метод сделать так, чтобы глобальные переменные у каждого загруженного экземпляра DLL были свои?

Встречный вопрос: откуда уверенность, что один и тот же процесс будет иметь "несколько экземпляров" одной и той же длл?


Медвежонок Пятачок   (2009-09-14 11:18:00) [13]

они и так будут свои у каждого процесса


Наверх

Титульная страница Поиск, карта сайта Написать письмо