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

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


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

Ну и в том модуле, где она лежит, ее соответственно надо экспортировать, либо с помощью опять-таки .DEF файла, либо с помощью директивы __declspec(__dllexport) .
...
Рейтинг: 0 / 0
15.09.2006, 22:18
    #33991576
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опять глобальные переменные
то есть глобальную переменную нужно определять в дллке. Эту дллку загружать во всех дллках и в проге. Если я всё помню правильно, у дллки своя память и будет только один экземпляр переменной. Но это лучше уточнить.
...
Рейтинг: 0 / 0
15.09.2006, 23:06
    #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
17.09.2006, 11:50
    #33992349
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опять глобальные переменные
White OwlКаждая LoadLibrary порождает кусок памяти для глобальных переменных объявленных в dll.
Сколько раз LoadLibrary сделали - столько копий глобальной переменной создали. Читать тут до полного просветления:спс. Честно говоря, так и не удосужился просветиться по поводу архитектуры дллей. Означенного тобой текста по ссылке не нашёл. Читаю дальше.
...
Рейтинг: 0 / 0
17.09.2006, 11:59
    #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
17.09.2006, 11:59
    #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
17.09.2006, 12:24
    #33992383
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опять глобальные переменные
фишка в том, что процесс имеет только один экземпляр данных длл. И с этим нужно ооочень осторожно обращаться и всегда помнить, что у виска всегда висит этот пистолет. Как расширение к этой модели был придуман thread local storage, который позволяет особым образом выделять память для каждого потока отдельно - и всё равно остаётся один поток - один экземпляр памяти.
Разумеется, разные процессы владеют разными копиями данных длл.
...
Рейтинг: 0 / 0
17.09.2006, 14:45
    #33992534
Карабас Барабас
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Опять глобальные переменные
MasterZiv Карабас Барабас itan
непонятно, как ДЛЛ, по идее могущая быть загруженной любым процессом, будет знать про какие-то там переменные в твоей программе ?


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

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

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

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


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


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

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

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

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

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

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

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

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

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


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

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

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

Если процесс пытается загрузить dll несколько раз (например, он не отслеживает, загружалась эта DLL ранее или нет), то инициализация DLL в процессе происходит только при первой закрузке.
...
Рейтинг: 0 / 0
18.09.2006, 19:46
    #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
Форумы / C++ [игнор отключен] [закрыт для гостей] / Опять глобальные переменные / 25 сообщений из 33, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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