|
|
|
Опять глобальные переменные
|
|||
|---|---|---|---|
|
#18+
Проблема такая: есть программа, разбитая на головной exe-шник и пару dll-ек. При запуске программа считывает параметры командной строки. Вопрос в следующем - как мне будет правильнее всего определить глобальную переменную с этими параметрами, чтобы она была доступна во всех частях программы ( и в exe и в dll) ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2006, 16:35 |
|
||
|
Опять глобальные переменные
|
|||
|---|---|---|---|
|
#18+
itan непонятно, как ДЛЛ, по идее могущая быть загруженной любым процессом, будет знать про какие-то там переменные в твоей программе ? ИМХО: надо передавать указатели на эти переменные при вызове функций ДЛЛ Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2006, 16:40 |
|
||
|
Опять глобальные переменные
|
|||
|---|---|---|---|
|
#18+
А можно ли сделать по другому - например, загрузить библиотеку с тем же входным параметром в командной строке, что и "exe", а затем инициализировать глобальную переменную уже в dll ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2006, 16:54 |
|
||
|
Опять глобальные переменные
|
|||
|---|---|---|---|
|
#18+
Объявляешь как хочешь. Передаешь указатель. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2006, 16:54 |
|
||
|
Опять глобальные переменные
|
|||
|---|---|---|---|
|
#18+
Карабас Барабас itan непонятно, как ДЛЛ, по идее могущая быть загруженной любым процессом, будет знать про какие-то там переменные в твоей программе ? Запросто будет знать. Достаточно лишь подключить соответствующую библиотеку импорта или прописать переменную в .DEF файле. Никаких указателей никуда не надо передавать (ну то есть это не обязательно). Ну и в том модуле, где она лежит, ее соответственно надо экспортировать, либо с помощью опять-таки .DEF файла, либо с помощью директивы __declspec(__dllexport) . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2006, 20:35 |
|
||
|
Опять глобальные переменные
|
|||
|---|---|---|---|
|
#18+
то есть глобальную переменную нужно определять в дллке. Эту дллку загружать во всех дллках и в проге. Если я всё помню правильно, у дллки своя память и будет только один экземпляр переменной. Но это лучше уточнить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2006, 22:18 |
|
||
|
Опять глобальные переменные
|
|||
|---|---|---|---|
|
#18+
maXmoто есть глобальную переменную нужно определять в дллке. Эту дллку загружать во всех дллках и в проге. Если я всё помню правильно, у дллки своя память и будет только один экземпляр переменной. Но это лучше уточнить. Каждая LoadLibrary порождает кусок памяти для глобальных переменных объявленных в dll. Сколько раз LoadLibrary сделали - столько копий глобальной переменной создали. Читать тут до полного просветления: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/dynamic_link_library_data.asp А по первому вопросу, как сделать глобальную переменную в хост-программе и дать для дллки доступ к ней, то как уже говорили - передавать в длл-ку ссылку на переменную. Если глобальных переменных много - их можно сгрупировать в структуру. Например так: Код: plaintext 1. 2. 3. 4. 5. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.09.2006, 23:06 |
|
||
|
Опять глобальные переменные
|
|||
|---|---|---|---|
|
#18+
White OwlКаждая LoadLibrary порождает кусок памяти для глобальных переменных объявленных в dll. Сколько раз LoadLibrary сделали - столько копий глобальной переменной создали. Читать тут до полного просветления:спс. Честно говоря, так и не удосужился просветиться по поводу архитектуры дллей. Означенного тобой текста по ссылке не нашёл. Читаю дальше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2006, 11:50 |
|
||
|
Опять глобальные переменные
|
|||
|---|---|---|---|
|
#18+
нашол Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2006, 11:59 |
|
||
|
Опять глобальные переменные
|
|||
|---|---|---|---|
|
#18+
амно авторWhen the application calls the LoadLibrary or LoadLibraryEx functions, the system attempts to locate the DLL (for details, see Dynamic-Link Library Search Order). If the search succeeds, the system maps the DLL module into the virtual address space of the process and increments the reference count. If the call to LoadLibrary or LoadLibraryEx specifies a DLL whose code is already mapped into the virtual address space of the calling process, the function simply returns a handle to the DLL and increments the DLL reference count. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2006, 11:59 |
|
||
|
Опять глобальные переменные
|
|||
|---|---|---|---|
|
#18+
фишка в том, что процесс имеет только один экземпляр данных длл. И с этим нужно ооочень осторожно обращаться и всегда помнить, что у виска всегда висит этот пистолет. Как расширение к этой модели был придуман thread local storage, который позволяет особым образом выделять память для каждого потока отдельно - и всё равно остаётся один поток - один экземпляр памяти. Разумеется, разные процессы владеют разными копиями данных длл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2006, 12:24 |
|
||
|
Опять глобальные переменные
|
|||
|---|---|---|---|
|
#18+
MasterZiv Карабас Барабас itan непонятно, как ДЛЛ, по идее могущая быть загруженной любым процессом, будет знать про какие-то там переменные в твоей программе ? Запросто будет знать. Достаточно лишь подключить соответствующую библиотеку импорта или прописать переменную в .DEF файле. Никаких указателей никуда не надо передавать (ну то есть это не обязательно). Ну и в том модуле, где она лежит, ее соответственно надо экспортировать, либо с помощью опять-таки .DEF файла, либо с помощью директивы __declspec(__dllexport) .Ты описываешь случай, когда переменная определена в ДЛЛ, я же отвечаю, что переманная, определеная в ЕХЕ не будет известна в ДЛЛ (в общем случае) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2006, 14:45 |
|
||
|
Опять глобальные переменные
|
|||
|---|---|---|---|
|
#18+
maXmoто есть глобальную переменную нужно определять в дллке. Эту дллку загружать во всех дллках и в проге. Можно и не в DLL-ке, а в Exe-хе. Разницы никакой нет. maXmo Если я всё помню правильно, у дллки своя память и будет только один экземпляр переменной. Но это лучше уточнить. Неправильно помнишь. Память у процесса , а не у DLL-ки. Но экземпляр переменной будет только один. А как же еще-то может быть ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2006, 23:18 |
|
||
|
Опять глобальные переменные
|
|||
|---|---|---|---|
|
#18+
White Owl Каждая LoadLibrary порождает кусок памяти для глобальных переменных объявленных в dll. Если добавить "первая" и "в каждом процессе", то будет все правильно. Т.е. "Каждая первая LoadLibrary в каждом процессе порождает в этом процессе кусок памяти для глобальных переменных, объявленных в загружаемой dll." ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2006, 23:20 |
|
||
|
Опять глобальные переменные
|
|||
|---|---|---|---|
|
#18+
maXmoфишка в том, что процесс имеет только один экземпляр данных длл. Глобальная переменная всегда одна. Странно , если бы их было бы много. Я же одну объявляю. Так что в чем "фишка" -- не понятно. Одну переменную объявил, одно переменную получил. У каждого процесса она своя, как и следовало бы ожидать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.09.2006, 23:23 |
|
||
|
Опять глобальные переменные
|
|||
|---|---|---|---|
|
#18+
Код: plaintext Только не надо так делать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2006, 08:46 |
|
||
|
Опять глобальные переменные
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan), вах! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2006, 11:32 |
|
||
|
Опять глобальные переменные
|
|||
|---|---|---|---|
|
#18+
какой вопрос, такой ответ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2006, 13:15 |
|
||
|
Опять глобальные переменные
|
|||
|---|---|---|---|
|
#18+
тока тредстартер хотел глобальную переменную в рамках одного процесса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2006, 13:42 |
|
||
|
Опять глобальные переменные
|
|||
|---|---|---|---|
|
#18+
itanВопрос в следующем - как мне будет правильнее всего определить глобальную переменную с этими параметрами, чтобы она была доступна во всех частях программы ( и в exe и в dll) ? автортока тредстартер хотел глобальную переменную в рамках одного процесса Я понял исходный вопрос несколько по другому (прикладная телепатия и ясновидение никогда не были моим сильным местом). Поскольку речь идет о разделении данных между различными отдельно загружаемыми МОДУЛЯМИ проекта, предлагаемай разделяемая секция превращается в разделяемую память. Еще раз повторюсь, так делать НЕ НАДО, ибо 1. Из пушки по воробьям 2. Недетский гемор с синхронизацией доступа ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2006, 14:11 |
|
||
|
Опять глобальные переменные
|
|||
|---|---|---|---|
|
#18+
itanПроблема такая: есть программа, разбитая на головной exe-шник и пару dll-ек. При запуске программа считывает параметры командной строки. Вопрос в следующем - как мне будет правильнее всего определить глобальную переменную с этими параметрами, чтобы она была доступна во всех частях программы ( и в exe и в dll) ? обявляете любую глобальную переменную и вперёд...в чём проблема то ? Более красивее - обернуть классиком. При входе в экзешник - проинициализировать явно (не явно будет до передачи управления ышо, по умолчанию дык сказать)...далее юзать... (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2006, 14:49 |
|
||
|
Опять глобальные переменные
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan)Поскольку речь идет о разделении данных между различными отдельно загружаемыми МОДУЛЯМИ проектадллка ехешником обычно грузится в свой процесс. Программа одна . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2006, 16:07 |
|
||
|
Опять глобальные переменные
|
|||
|---|---|---|---|
|
#18+
можно считать dll внешним класом. но ооп не рекомендует вообще использование глобальных переменных ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2006, 17:41 |
|
||
|
Опять глобальные переменные
|
|||
|---|---|---|---|
|
#18+
itanПроблема такая: есть программа, разбитая на головной exe-шник и пару dll-ек. При запуске программа считывает параметры командной строки. Вопрос в следующем - как мне будет правильнее всего определить глобальную переменную с этими параметрами, чтобы она была доступна во всех частях программы ( и в exe и в dll) ? Объявить переменную в DLL'ке и после загрузки DLL в процесс exe'шника вызывать из неё процедуру инициализации этой переменной. Экспорт переменной из exe тоже возможен, однако он создаст ненужную зависимость DLL от exe. Лучше так не делать. Каждый процесс ОС имеет собственную область памяти для хранения глобальных переменных, стек и т.п. Так что между процессами глобальные переменные объявленные в DLL не перепутаются. Если процесс пытается загрузить dll несколько раз (например, он не отслеживает, загружалась эта DLL ранее или нет), то инициализация DLL в процессе происходит только при первой закрузке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2006, 17:45 |
|
||
|
Опять глобальные переменные
|
|||
|---|---|---|---|
|
#18+
maXmoнашолНе то нашел :) Первые две фразы в той статье: The default scope of DLL variables is the same as that of variables declared in the application. Global variables in a DLL source code file are global to each process using the DLL. Дальше идет уже детальное объяснение. Которое в итоге выливается в то что говорили я и MasterZiv :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.09.2006, 19:46 |
|
||
|
Опять глобальные переменные
|
|||
|---|---|---|---|
|
#18+
White OwlКаждая LoadLibrary порождает кусок памяти для глобальных переменных объявленных в dll. Сколько раз LoadLibrary сделали - столько копий глобальной переменной создали.Второе предложение можно понять так, что при каждом вызове LoadLibrary будет появляться новая копия глобальной переменной. Ziv же тебя поправил, что так делает только первый вызов функции, остальные (для этой же дллки) никаких копий глобальной переменной не создают. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2006, 10:52 |
|
||
|
Опять глобальные переменные
|
|||
|---|---|---|---|
|
#18+
maXmoто есть глобальную переменную нужно определять в дллке. Эту дллку загружать во всех дллках и в проге. Если я всё помню правильно, у дллки своя память и будет только один экземпляр переменной. Но это лучше уточнить. Неправильно помнишь. нет у Dll-ки "своей" памяти, она маппируется в адресное пространство процесса. Win32 старается по возможности использовать секции совместно (между различными экземплярами процесса), но при записи, создается копия секции. Для того, чтобы секция разделялся МЕЖДУ процессами, ее нужно при линковке объявить разделяемой. Как я показал (и это вызвало твой нездоровый смех). При этом обязательно синхронизировать доступ к разделяемой памяти. Если же разделять данные между процессами не нужно, то я вообще не вижу какой-то проблемы достойной создания топика. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2006, 11:46 |
|
||
|
Опять глобальные переменные
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan)нет у Dll-ки "своей" памяти, она маппируется в адресное пространство процесса.это-то ясно. Под своей памятью я подразумевал то, что эта память не дублируется при множественной загрузке дллки. То есть память дллки не принадлежит модулю, загрузившему дллку, а разделяется между всеми модулями, загрузившими дллку. По логике-то если модуль загружает дллку, то чтобы он с ней ни делал, это не должно влиять на поведение дллки в других модулях, а оно на самом деле влияет. В этом смысле память дллки принадлежит дллке и с ней не слудет обращаться так, будто она принадлежит модулю, загрузившему дллку. Ясен пень, что вся память процесса принадлежит процессу, это как бы никто сомнению не подвергал. Дались вам эти процессы, будто жить без них не можете. Gluk (Kazan)Если же разделять данные между процессами не нужно, то я вообще не вижу какой-то проблемы достойной создания топика.данные нужно раделять между ехешником и его дллками. И не просто разделять, а сделать глобальными, то есть вариант с передачей указателя - это не совсем то :) Интересно, почему ты не подумал, что чел хочет разделять память между машинами? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2006, 12:09 |
|
||
|
Опять глобальные переменные
|
|||
|---|---|---|---|
|
#18+
потому что у чела явно нет кластера он и задачу то внятно сформулировать не может если можно назвать это задачей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2006, 14:58 |
|
||
|
Опять глобальные переменные
|
|||
|---|---|---|---|
|
#18+
телепатия - это умение не фантазировать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2006, 15:22 |
|
||
|
Опять глобальные переменные
|
|||
|---|---|---|---|
|
#18+
нет, телепатия это способность сверхчувственного восприятия и я ей к сожалению не владею предлагаю флейм на этом прекратить ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2006, 16:29 |
|
||
|
Опять глобальные переменные
|
|||
|---|---|---|---|
|
#18+
Gluk (Kazan)предлагаю флейм на этом прекратитьподдерживаю :) полезная информация исчерпалась в контексте темы Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2006, 16:33 |
|
||
|
Опять глобальные переменные
|
|||
|---|---|---|---|
|
#18+
maXmo White OwlКаждая LoadLibrary порождает кусок памяти для глобальных переменных объявленных в dll. Сколько раз LoadLibrary сделали - столько копий глобальной переменной создали.Второе предложение можно понять так, что при каждом вызове LoadLibrary будет появляться новая копия глобальной переменной. Ziv же тебя поправил, что так делает только первый вызов функции, остальные (для этой же дллки) никаких копий глобальной переменной не создают.Ну да, поправил. Я согласен с его поправкой. А вот с твоим пояснением его поправки я уже не согласен, по той же самой причине по которой MasterZiv начал поправлять меня. Если вы все еще понимаете кто что сказал и чьи слова надо считать за самую полную правду - вы молодец :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2006, 19:45 |
|
||
|
|

start [/forum/topic.php?all=1&fid=57&tid=2030479]: |
0ms |
get settings: |
12ms |
get forum list: |
20ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
170ms |
get topic data: |
9ms |
get forum data: |
5ms |
get page messages: |
75ms |
get tp. blocked users: |
2ms |
| others: | 232ms |
| total: | 533ms |

| 0 / 0 |
