
Новые сообщения [новые:0]
Дайджест
Горячие темы
Избранное [новые:0]
Форумы
Пользователи
Статистика
Статистика нагрузки
Мод. лог
Поиск
|
|
15.09.2006, 16:35
|
|||
|---|---|---|---|
|
|||
Опять глобальные переменные |
|||
|
#18+
Проблема такая: есть программа, разбитая на головной exe-шник и пару dll-ек. При запуске программа считывает параметры командной строки. Вопрос в следующем - как мне будет правильнее всего определить глобальную переменную с этими параметрами, чтобы она была доступна во всех частях программы ( и в exe и в dll) ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
15.09.2006, 16:40
|
|||
|---|---|---|---|
|
|||
Опять глобальные переменные |
|||
|
#18+
itan непонятно, как ДЛЛ, по идее могущая быть загруженной любым процессом, будет знать про какие-то там переменные в твоей программе ? ИМХО: надо передавать указатели на эти переменные при вызове функций ДЛЛ Posted via ActualForum NNTP Server 1.3 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
15.09.2006, 16:54
|
|||
|---|---|---|---|
|
|||
Опять глобальные переменные |
|||
|
#18+
А можно ли сделать по другому - например, загрузить библиотеку с тем же входным параметром в командной строке, что и "exe", а затем инициализировать глобальную переменную уже в dll ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
15.09.2006, 16:54
|
|||
|---|---|---|---|
Опять глобальные переменные |
|||
|
#18+
Объявляешь как хочешь. Передаешь указатель. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
15.09.2006, 20:35
|
|||
|---|---|---|---|
Опять глобальные переменные |
|||
|
#18+
Карабас Барабас itan непонятно, как ДЛЛ, по идее могущая быть загруженной любым процессом, будет знать про какие-то там переменные в твоей программе ? Запросто будет знать. Достаточно лишь подключить соответствующую библиотеку импорта или прописать переменную в .DEF файле. Никаких указателей никуда не надо передавать (ну то есть это не обязательно). Ну и в том модуле, где она лежит, ее соответственно надо экспортировать, либо с помощью опять-таки .DEF файла, либо с помощью директивы __declspec(__dllexport) . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
15.09.2006, 22:18
|
|||
|---|---|---|---|
Опять глобальные переменные |
|||
|
#18+
то есть глобальную переменную нужно определять в дллке. Эту дллку загружать во всех дллках и в проге. Если я всё помню правильно, у дллки своя память и будет только один экземпляр переменной. Но это лучше уточнить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
15.09.2006, 23:06
|
|||
|---|---|---|---|
Опять глобальные переменные |
|||
|
#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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
17.09.2006, 11:50
|
|||
|---|---|---|---|
Опять глобальные переменные |
|||
|
#18+
White OwlКаждая LoadLibrary порождает кусок памяти для глобальных переменных объявленных в dll. Сколько раз LoadLibrary сделали - столько копий глобальной переменной создали. Читать тут до полного просветления:спс. Честно говоря, так и не удосужился просветиться по поводу архитектуры дллей. Означенного тобой текста по ссылке не нашёл. Читаю дальше. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
17.09.2006, 11:59
|
|||
|---|---|---|---|
Опять глобальные переменные |
|||
|
#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, 12:24
|
|||
|---|---|---|---|
Опять глобальные переменные |
|||
|
#18+
фишка в том, что процесс имеет только один экземпляр данных длл. И с этим нужно ооочень осторожно обращаться и всегда помнить, что у виска всегда висит этот пистолет. Как расширение к этой модели был придуман thread local storage, который позволяет особым образом выделять память для каждого потока отдельно - и всё равно остаётся один поток - один экземпляр памяти. Разумеется, разные процессы владеют разными копиями данных длл. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
17.09.2006, 14:45
|
|||
|---|---|---|---|
|
|||
Опять глобальные переменные |
|||
|
#18+
MasterZiv Карабас Барабас itan непонятно, как ДЛЛ, по идее могущая быть загруженной любым процессом, будет знать про какие-то там переменные в твоей программе ? Запросто будет знать. Достаточно лишь подключить соответствующую библиотеку импорта или прописать переменную в .DEF файле. Никаких указателей никуда не надо передавать (ну то есть это не обязательно). Ну и в том модуле, где она лежит, ее соответственно надо экспортировать, либо с помощью опять-таки .DEF файла, либо с помощью директивы __declspec(__dllexport) .Ты описываешь случай, когда переменная определена в ДЛЛ, я же отвечаю, что переманная, определеная в ЕХЕ не будет известна в ДЛЛ (в общем случае) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
17.09.2006, 23:18
|
|||
|---|---|---|---|
Опять глобальные переменные |
|||
|
#18+
maXmoто есть глобальную переменную нужно определять в дллке. Эту дллку загружать во всех дллках и в проге. Можно и не в DLL-ке, а в Exe-хе. Разницы никакой нет. maXmo Если я всё помню правильно, у дллки своя память и будет только один экземпляр переменной. Но это лучше уточнить. Неправильно помнишь. Память у процесса , а не у DLL-ки. Но экземпляр переменной будет только один. А как же еще-то может быть ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
17.09.2006, 23:20
|
|||
|---|---|---|---|
Опять глобальные переменные |
|||
|
#18+
White Owl Каждая LoadLibrary порождает кусок памяти для глобальных переменных объявленных в dll. Если добавить "первая" и "в каждом процессе", то будет все правильно. Т.е. "Каждая первая LoadLibrary в каждом процессе порождает в этом процессе кусок памяти для глобальных переменных, объявленных в загружаемой dll." ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
17.09.2006, 23:23
|
|||
|---|---|---|---|
Опять глобальные переменные |
|||
|
#18+
maXmoфишка в том, что процесс имеет только один экземпляр данных длл. Глобальная переменная всегда одна. Странно , если бы их было бы много. Я же одну объявляю. Так что в чем "фишка" -- не понятно. Одну переменную объявил, одно переменную получил. У каждого процесса она своя, как и следовало бы ожидать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.09.2006, 08:46
|
|||
|---|---|---|---|
|
|||
Опять глобальные переменные |
|||
|
#18+
Код: plaintext Только не надо так делать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.09.2006, 11:32
|
|||
|---|---|---|---|
Опять глобальные переменные |
|||
|
#18+
Gluk (Kazan), вах! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.09.2006, 13:15
|
|||
|---|---|---|---|
|
|||
Опять глобальные переменные |
|||
|
#18+
какой вопрос, такой ответ ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.09.2006, 13:42
|
|||
|---|---|---|---|
Опять глобальные переменные |
|||
|
#18+
тока тредстартер хотел глобальную переменную в рамках одного процесса ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.09.2006, 14:11
|
|||
|---|---|---|---|
|
|||
Опять глобальные переменные |
|||
|
#18+
itanВопрос в следующем - как мне будет правильнее всего определить глобальную переменную с этими параметрами, чтобы она была доступна во всех частях программы ( и в exe и в dll) ? автортока тредстартер хотел глобальную переменную в рамках одного процесса Я понял исходный вопрос несколько по другому (прикладная телепатия и ясновидение никогда не были моим сильным местом). Поскольку речь идет о разделении данных между различными отдельно загружаемыми МОДУЛЯМИ проекта, предлагаемай разделяемая секция превращается в разделяемую память. Еще раз повторюсь, так делать НЕ НАДО, ибо 1. Из пушки по воробьям 2. Недетский гемор с синхронизацией доступа ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.09.2006, 14:49
|
|||
|---|---|---|---|
Опять глобальные переменные |
|||
|
#18+
itanПроблема такая: есть программа, разбитая на головной exe-шник и пару dll-ек. При запуске программа считывает параметры командной строки. Вопрос в следующем - как мне будет правильнее всего определить глобальную переменную с этими параметрами, чтобы она была доступна во всех частях программы ( и в exe и в dll) ? обявляете любую глобальную переменную и вперёд...в чём проблема то ? Более красивее - обернуть классиком. При входе в экзешник - проинициализировать явно (не явно будет до передачи управления ышо, по умолчанию дык сказать)...далее юзать... (круглый) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.09.2006, 16:07
|
|||
|---|---|---|---|
Опять глобальные переменные |
|||
|
#18+
Gluk (Kazan)Поскольку речь идет о разделении данных между различными отдельно загружаемыми МОДУЛЯМИ проектадллка ехешником обычно грузится в свой процесс. Программа одна . ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.09.2006, 17:41
|
|||
|---|---|---|---|
Опять глобальные переменные |
|||
|
#18+
можно считать dll внешним класом. но ооп не рекомендует вообще использование глобальных переменных ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.09.2006, 17:45
|
|||
|---|---|---|---|
Опять глобальные переменные |
|||
|
#18+
itanПроблема такая: есть программа, разбитая на головной exe-шник и пару dll-ек. При запуске программа считывает параметры командной строки. Вопрос в следующем - как мне будет правильнее всего определить глобальную переменную с этими параметрами, чтобы она была доступна во всех частях программы ( и в exe и в dll) ? Объявить переменную в DLL'ке и после загрузки DLL в процесс exe'шника вызывать из неё процедуру инициализации этой переменной. Экспорт переменной из exe тоже возможен, однако он создаст ненужную зависимость DLL от exe. Лучше так не делать. Каждый процесс ОС имеет собственную область памяти для хранения глобальных переменных, стек и т.п. Так что между процессами глобальные переменные объявленные в DLL не перепутаются. Если процесс пытается загрузить dll несколько раз (например, он не отслеживает, загружалась эта DLL ранее или нет), то инициализация DLL в процессе происходит только при первой закрузке. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|
18.09.2006, 19:46
|
|||
|---|---|---|---|
Опять глобальные переменные |
|||
|
#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 :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
|
|
|

start [/forum/topic.php?fid=57&tablet=1&tid=2030479]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
151ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
84ms |
get tp. blocked users: |
1ms |
| others: | 207ms |
| total: | 486ms |

| 0 / 0 |
