![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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]они и так будут свои у каждого процесса