Страница 1 из 2
Глобальные переменные
Добавлено: 20 янв 2010, 18:15
T_Dmitry_L
возможно ли что бы один экзешник подгружал сначала первую библиотеку, которя меняла "общие" переменные(переменные хранятся в экзешнике), а потом подгружал вторую, которая бы их использовала?
Re: глобальные переменные
Добавлено: 20 янв 2010, 18:23
Decoder
Можно конечно. Эти переменные лучше объединить в одну структуру, а потом указатель на эту структуру передавать в качестве параметра при вызове экспортируемых функций в разных DLL-ках.
Re: глобальные переменные
Добавлено: 20 янв 2010, 18:59
T_Dmitry_L
Decoder писал(а):Можно конечно. Эти переменные лучше объединить в одну структуру, а потом указатель на эту структуру передавать в качестве параметра при вызове экспортируемых функций в разных DLL-ках.
А если вызываются несколько библиотек с одними и теми же экспортными функциями (эти функциии определены и стандартизированны) и каждой библиотеки нужне свой набор переменных! можно конечно кинуть все в одну структуру, но не хотелось бы... можно это как то через глобальные переменные сделать?
Re: глобальные переменные
Добавлено: 20 янв 2010, 19:27
BulldozerBSG
T_Dmitry_L писал(а):А если вызываются несколько библиотек с одними и теми же экспортными функциями (эти функциии определены и стандартизированны) и каждой библиотеки нужне свой набор переменных! можно конечно кинуть все в одну структуру, но не хотелось бы... можно это как то через глобальные переменные сделать?
Глобальные переменные для исполнимого файла не пересекаются с глобальными переменными DLL библиотек, поэтому необходимо библиотеке передавать указатель на них. И совместить их нельзя (простым способом).
Re: глобальные переменные
Добавлено: 21 янв 2010, 11:41
T_Dmitry_L
BulldozerBSG писал(а):Глобальные переменные для исполнимого файла не пересекаются с глобальными переменными DLL библиотек, поэтому необходимо библиотеке передавать указатель на них. И совместить их нельзя (простым способом).
эт я знаю что они не пересекаются, и спрашиваю, поскажите "сложный способ", как библиотеке увидеть переменные исполняемого файла. Передача по ссылке не подходит.
Re: глобальные переменные
Добавлено: 21 янв 2010, 11:55
IceFlame
Что значит "увидеть переменные"? Во время исполнения никаких имен переменных нет, это лишь безымянные ячейки памяти. Можно разве что использовать глобальные объекты Windows.
А в чем проблема использования переменных по указателю? Почему ее нельзя использовать?
Re: глобальные переменные
Добавлено: 21 янв 2010, 13:08
BulldozerBSG
T_Dmitry_L писал(а):эт я знаю что они не пересекаются, и спрашиваю, поскажите "сложный способ", как библиотеке увидеть переменные исполняемого файла. Передача по ссылке не подходит.
Если нет исходных кодов то никак. Плюс код будет сильно платформо зависимый.
Главное правильно распределить роли, какой модуль за что будет ответственен.
1. В глобальных переменных исполнимого файла создать переменную маркер (массив содержащий уникальные известные данные). По не будет происходить поиск.
2. Вслед за маркером разместить переменные которые необходимо видеть и библиотеке. Последовательность играет роль. Поэтому все это добро лучше поместить в структуру.
3. В библиотеке реализовать механизм поиска этой структуры во всей памяти. (В карте памяти ищим область содержащую наш исполнимый файл, находим секцию с глобальными переменными, а в ней наш маркер. За маркером будут следовать все наши переменные). Поиск необходимо производить непосредственно перед использованием. И ни в коем случае не в функции инициализации библиотеки (ATACH).
4. Также эти переменные нельзя использовать при выгрузке библиотеки (DETACH).
Остаются вопросы связанные с синхронизацией доступа к этим переменным в много поточном исполнении. И все это в общем не стандартное поведение, какие при этом могут вылезти глюки это еще тот вопрос.
Re: глобальные переменные
Добавлено: 21 янв 2010, 19:01
Decoder
Дело в том, что экспорт/импорт функций может выполняться не только из DLL в ЕХЕ-файл, но и в обратном порядке. Сам ЕХЕ-файл тоже может экспортировать функции, а загружаемая им DLL импортировать их. Хотя такое решение встречается довольно редко, но оно вполне пригодно для твоей задачи. Т.е. ЕХЕ-файл экспортирует какую-то функцию, которая предоставляет доступ к его внутренним переменным, а загружаемая динамическая библиотека через эту функцию обращается к тем данным.
Re: глобальные переменные
Добавлено: 22 янв 2010, 13:37
T_Dmitry_L
BulldozerBSG писал(а):
1. В глобальных переменных исполнимого файла создать переменную маркер (массив содержащий уникальные известные данные). По не будет происходить поиск.
BulldozerBSG писал(а):
3. В библиотеке реализовать механизм поиска этой структуры во всей памяти.
Приведите пожалуйста пример создание переменной маркера и ее механизм поиска из библиотеки. Или может про это где почитать можно?
Re: глобальные переменные
Добавлено: 22 янв 2010, 13:41
T_Dmitry_L
Decoder писал(а):Сам ЕХЕ-файл тоже может экспортировать функции, а загружаемая им DLL импортировать их.
Напишите пожалуйста пример как можно экспортировать функции из экзешника