powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Опять глобальные переменные
33 сообщений из 33, показаны все 2 страниц
Опять глобальные переменные
    #33990925
itan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема такая:
есть программа, разбитая на головной exe-шник и пару dll-ек. При запуске программа считывает параметры командной строки.
Вопрос в следующем - как мне будет правильнее всего определить глобальную переменную с этими параметрами, чтобы она была доступна во всех частях программы ( и в exe и в dll) ?
...
Рейтинг: 0 / 0
Опять глобальные переменные
    #33990945
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
itan
непонятно, как ДЛЛ, по идее могущая быть загруженной любым процессом, будет знать про какие-то там переменные в твоей программе ?

ИМХО: надо передавать указатели на эти переменные при вызове функций ДЛЛ
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Опять глобальные переменные
    #33991003
itan
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
А можно ли сделать по другому - например, загрузить библиотеку с тем же входным параметром в командной строке, что и "exe", а затем инициализировать глобальную переменную уже в dll ?
...
Рейтинг: 0 / 0
Опять глобальные переменные
    #33991004
Akh
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Объявляешь как хочешь. Передаешь указатель.
...
Рейтинг: 0 / 0
Опять глобальные переменные
    #33991468
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Карабас Барабас itan
непонятно, как ДЛЛ, по идее могущая быть загруженной любым процессом, будет знать про какие-то там переменные в твоей программе ?


Запросто будет знать. Достаточно лишь подключить соответствующую библиотеку импорта или прописать переменную в .DEF файле.
Никаких указателей никуда не надо передавать (ну то есть это не обязательно).

Ну и в том модуле, где она лежит, ее соответственно надо экспортировать, либо с помощью опять-таки .DEF файла, либо с помощью директивы __declspec(__dllexport) .
...
Рейтинг: 0 / 0
Опять глобальные переменные
    #33991576
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
то есть глобальную переменную нужно определять в дллке. Эту дллку загружать во всех дллках и в проге. Если я всё помню правильно, у дллки своя память и будет только один экземпляр переменной. Но это лучше уточнить.
...
Рейтинг: 0 / 0
Опять глобальные переменные
    #33991601
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
// super.h
struct GlobalOptions {
   int SomeOption;
   char SomeTextOption1[ 20 ];
   char SomeTextOption2[ 10 ];
};
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
// program_source.c
#include "super.h"

struct GlobalOptions options;

int main() {
   options.SomeOption= 1 ;
   ...
   // вызываем обязательно один раз
   // ДО вызова любой другой функции из этой dll
   MyDllInit(&options); 
   ....
}

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
// dll_source.c
#include "super.h"
struct GlobalOptions *options;

void _export MyDllInit(struct GlobalOptions *o) {
   options = o;
}

void _export SomeDllFunction(....) {
  if (options->SomeOption ==  1 ) {
     ......
  } else if (options->SomeOption ==  2 ) {
     ......
  } else {
     ......
  }
}
...
Рейтинг: 0 / 0
Опять глобальные переменные
    #33992349
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlКаждая LoadLibrary порождает кусок памяти для глобальных переменных объявленных в dll.
Сколько раз LoadLibrary сделали - столько копий глобальной переменной создали. Читать тут до полного просветления:спс. Честно говоря, так и не удосужился просветиться по поводу архитектуры дллей. Означенного тобой текста по ссылке не нашёл. Читаю дальше.
...
Рейтинг: 0 / 0
Опять глобальные переменные
    #33992360
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нашол
Код: plaintext
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.
мнения разошлись.
...
Рейтинг: 0 / 0
Опять глобальные переменные
    #33992362
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
амно автор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.
...
Рейтинг: 0 / 0
Опять глобальные переменные
    #33992383
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
фишка в том, что процесс имеет только один экземпляр данных длл. И с этим нужно ооочень осторожно обращаться и всегда помнить, что у виска всегда висит этот пистолет. Как расширение к этой модели был придуман thread local storage, который позволяет особым образом выделять память для каждого потока отдельно - и всё равно остаётся один поток - один экземпляр памяти.
Разумеется, разные процессы владеют разными копиями данных длл.
...
Рейтинг: 0 / 0
Опять глобальные переменные
    #33992534
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv Карабас Барабас itan
непонятно, как ДЛЛ, по идее могущая быть загруженной любым процессом, будет знать про какие-то там переменные в твоей программе ?


Запросто будет знать. Достаточно лишь подключить соответствующую библиотеку импорта или прописать переменную в .DEF файле.
Никаких указателей никуда не надо передавать (ну то есть это не обязательно).

Ну и в том модуле, где она лежит, ее соответственно надо экспортировать, либо с помощью опять-таки .DEF файла, либо с помощью директивы __declspec(__dllexport) .Ты описываешь случай, когда переменная определена в ДЛЛ, я же отвечаю, что переманная, определеная в ЕХЕ не будет известна в ДЛЛ (в общем случае)
...
Рейтинг: 0 / 0
Опять глобальные переменные
    #33992848
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoто есть глобальную переменную нужно определять в дллке. Эту дллку загружать во всех дллках и в проге.

Можно и не в DLL-ке, а в Exe-хе. Разницы никакой нет.

maXmo
Если я всё помню правильно, у дллки своя память и будет только один экземпляр переменной. Но это лучше уточнить.


Неправильно помнишь. Память у процесса , а не у DLL-ки. Но экземпляр переменной будет только один. А как же еще-то может быть ?
...
Рейтинг: 0 / 0
Опять глобальные переменные
    #33992849
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl
Каждая LoadLibrary порождает кусок памяти для глобальных переменных объявленных в dll.


Если добавить "первая" и "в каждом процессе", то будет все правильно.
Т.е.

"Каждая первая LoadLibrary в каждом процессе порождает в этом процессе кусок памяти для глобальных переменных, объявленных в загружаемой dll."
...
Рейтинг: 0 / 0
Опять глобальные переменные
    #33992851
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoфишка в том, что процесс имеет только один экземпляр данных длл.

Глобальная переменная всегда одна. Странно , если бы их было бы много. Я же одну объявляю. Так что в чем "фишка" -- не понятно. Одну переменную объявил, одно переменную получил. У каждого процесса она своя, как и следовало бы ожидать.
...
Рейтинг: 0 / 0
Опять глобальные переменные
    #33993013
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
#pragma comment(linker, "/Section:Shared,RWS")

Только не надо так делать
...
Рейтинг: 0 / 0
Опять глобальные переменные
    #33993383
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan), вах!
...
Рейтинг: 0 / 0
Опять глобальные переменные
    #33993761
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
какой вопрос, такой ответ
...
Рейтинг: 0 / 0
Опять глобальные переменные
    #33993887
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тока тредстартер хотел глобальную переменную в рамках одного процесса
...
Рейтинг: 0 / 0
Опять глобальные переменные
    #33994028
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
itanВопрос в следующем - как мне будет правильнее всего определить глобальную переменную с этими параметрами, чтобы она была доступна во всех частях программы ( и в exe и в dll) ?

автортока тредстартер хотел глобальную переменную в рамках одного процесса

Я понял исходный вопрос несколько по другому (прикладная телепатия и ясновидение никогда не были моим сильным местом). Поскольку речь идет о разделении данных между различными отдельно загружаемыми МОДУЛЯМИ проекта, предлагаемай разделяемая секция превращается в разделяемую память.

Еще раз повторюсь, так делать НЕ НАДО, ибо

1. Из пушки по воробьям
2. Недетский гемор с синхронизацией доступа
...
Рейтинг: 0 / 0
Опять глобальные переменные
    #33994191
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
itanПроблема такая:
есть программа, разбитая на головной exe-шник и пару dll-ек. При запуске программа считывает параметры командной строки.
Вопрос в следующем - как мне будет правильнее всего определить глобальную переменную с этими параметрами, чтобы она была доступна во всех частях программы ( и в exe и в dll) ?

обявляете любую глобальную переменную и вперёд...в чём проблема то ? Более красивее - обернуть классиком. При входе в экзешник - проинициализировать явно (не явно будет до передачи управления ышо, по умолчанию дык сказать)...далее юзать...


(круглый)
...
Рейтинг: 0 / 0
Опять глобальные переменные
    #33994495
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan)Поскольку речь идет о разделении данных между различными отдельно загружаемыми МОДУЛЯМИ проектадллка ехешником обычно грузится в свой процесс. Программа одна .
...
Рейтинг: 0 / 0
Опять глобальные переменные
    #33994834
Den_di
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
можно считать dll внешним класом. но ооп не рекомендует вообще использование глобальных переменных
...
Рейтинг: 0 / 0
Опять глобальные переменные
    #33994849
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
itanПроблема такая:
есть программа, разбитая на головной exe-шник и пару dll-ек. При запуске программа считывает параметры командной строки.
Вопрос в следующем - как мне будет правильнее всего определить глобальную переменную с этими параметрами, чтобы она была доступна во всех частях программы ( и в exe и в dll) ?

Объявить переменную в DLL'ке и после загрузки DLL в процесс exe'шника вызывать из неё процедуру инициализации этой переменной.
Экспорт переменной из exe тоже возможен, однако он создаст ненужную зависимость DLL от exe. Лучше так не делать.

Каждый процесс ОС имеет собственную область памяти для хранения глобальных переменных, стек и т.п. Так что между процессами глобальные переменные объявленные в DLL не перепутаются.

Если процесс пытается загрузить dll несколько раз (например, он не отслеживает, загружалась эта DLL ранее или нет), то инициализация DLL в процессе происходит только при первой закрузке.
...
Рейтинг: 0 / 0
Опять глобальные переменные
    #33995164
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 :)
...
Рейтинг: 0 / 0
Опять глобальные переменные
    #33995949
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlКаждая LoadLibrary порождает кусок памяти для глобальных переменных объявленных в dll.
Сколько раз LoadLibrary сделали - столько копий глобальной переменной создали.Второе предложение можно понять так, что при каждом вызове LoadLibrary будет появляться новая копия глобальной переменной. Ziv же тебя поправил, что так делает только первый вызов функции, остальные (для этой же дллки) никаких копий глобальной переменной не создают.
...
Рейтинг: 0 / 0
Опять глобальные переменные
    #33996181
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmoто есть глобальную переменную нужно определять в дллке. Эту дллку загружать во всех дллках и в проге. Если я всё помню правильно, у дллки своя память и будет только один экземпляр переменной. Но это лучше уточнить.

Неправильно помнишь. нет у Dll-ки "своей" памяти, она маппируется в адресное пространство процесса. Win32 старается по возможности использовать секции совместно (между различными экземплярами процесса), но при записи, создается копия секции. Для того, чтобы секция разделялся МЕЖДУ процессами, ее нужно при линковке объявить разделяемой. Как я показал (и это вызвало твой нездоровый смех). При этом обязательно синхронизировать доступ к разделяемой памяти.

Если же разделять данные между процессами не нужно, то я вообще не вижу какой-то проблемы достойной создания топика.
...
Рейтинг: 0 / 0
Опять глобальные переменные
    #33996316
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan)нет у Dll-ки "своей" памяти, она маппируется в адресное пространство процесса.это-то ясно. Под своей памятью я подразумевал то, что эта память не дублируется при множественной загрузке дллки. То есть память дллки не принадлежит модулю, загрузившему дллку, а разделяется между всеми модулями, загрузившими дллку. По логике-то если модуль загружает дллку, то чтобы он с ней ни делал, это не должно влиять на поведение дллки в других модулях, а оно на самом деле влияет. В этом смысле память дллки принадлежит дллке и с ней не слудет обращаться так, будто она принадлежит модулю, загрузившему дллку. Ясен пень, что вся память процесса принадлежит процессу, это как бы никто сомнению не подвергал. Дались вам эти процессы, будто жить без них не можете.

Gluk (Kazan)Если же разделять данные между процессами не нужно, то я вообще не вижу какой-то проблемы достойной создания топика.данные нужно раделять между ехешником и его дллками. И не просто разделять, а сделать глобальными, то есть вариант с передачей указателя - это не совсем то :)

Интересно, почему ты не подумал, что чел хочет разделять память между машинами?
...
Рейтинг: 0 / 0
Опять глобальные переменные
    #33996992
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
потому что у чела явно нет кластера
он и задачу то внятно сформулировать не может

если можно назвать это задачей
...
Рейтинг: 0 / 0
Опять глобальные переменные
    #33997055
maXmo
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
телепатия - это умение не фантазировать
...
Рейтинг: 0 / 0
Опять глобальные переменные
    #33997356
Фотография Gluk (Kazan)
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
нет, телепатия это способность сверхчувственного восприятия
и я ей к сожалению не владею

предлагаю флейм на этом прекратить
...
Рейтинг: 0 / 0
Опять глобальные переменные
    #33997376
Карабас Барабас
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gluk (Kazan)предлагаю флейм на этом прекратитьподдерживаю :)
полезная информация исчерпалась в контексте темы
Posted via ActualForum NNTP Server 1.3
...
Рейтинг: 0 / 0
Опять глобальные переменные
    #33998010
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maXmo White OwlКаждая LoadLibrary порождает кусок памяти для глобальных переменных объявленных в dll.
Сколько раз LoadLibrary сделали - столько копий глобальной переменной создали.Второе предложение можно понять так, что при каждом вызове LoadLibrary будет появляться новая копия глобальной переменной. Ziv же тебя поправил, что так делает только первый вызов функции, остальные (для этой же дллки) никаких копий глобальной переменной не создают.Ну да, поправил. Я согласен с его поправкой. А вот с твоим пояснением его поправки я уже не согласен, по той же самой причине по которой MasterZiv начал поправлять меня.

Если вы все еще понимаете кто что сказал и чьи слова надо считать за самую полную правду - вы молодец :)
...
Рейтинг: 0 / 0
33 сообщений из 33, показаны все 2 страниц
Форумы / C++ [игнор отключен] [закрыт для гостей] / Опять глобальные переменные
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]