
Перенос Global Data
Модератор: Дед Пахом
Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
-
- Полимат
- Сообщения: 1810
- Зарегистрирован: 25 Март 2009, 21:55
- Благодарил (а): 24 раза
- Поблагодарили: 10 раз
Перенос Global Data
Возвращаюсь к глобальным данным.
Создал по примеру в кларионе dlltutor, allfiles.dll, в my.app выставил крыжики в глобальных настройках (см. скриншот 1 и 2). Скопировал все глобальные данные из my.app в allfiles.dll. Глобальные данные которые были в my.app, выставил (см. скриншот 3). Добавил в my.app полученную allfiles.lib, скомпилировал все это, без ошибок. При запуске my.exe выдает ошибку?! Мне кажется проблема связана с глобальными данными, может чего упустил?

- Вложения
-
- в my.app выставил крыжики в глобальных настройках
- dll1.jpg (11.53 КБ) 4188 просмотров
-
- и еще
- dll2.jpg (9.36 КБ) 4188 просмотров
-
- в глобальных данных которые были в my.app
- dll3.jpg (4.2 КБ) 4188 просмотров
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Перенос Global Data
Никогда не делал EXTERNAL, THREAD. Не знаю для чего это нужно.
Обычно делается так.
В словаре или в основной DLL которая у вас AllFiles.app описываются глобальные переменные. К примеру:
GLO:Variable1 LONG
GLO:Variable2 LONG
Тогда в любых остальных DLL и EXE они описываются как
GLO:Variable1 LONG,EXTERNAL,DLL
GLO:Variable2 LONG,EXTERNAL,DLL
Получаются общие глобальные переменные, память для которых выделяется в DLL AllFiles.app
Для THREAD переменных добавляем атрибут THREAD
В словаре или в основной DLL которая у вас AllFiles.app описываются глобальные переменные. К примеру:
GLO:Variable3 LONG,THREAD
Тогда в любых остальных DLL и EXE они описываются как
GLO:Variable3 LONG,EXTERNAL,DLL,THREAD
В описанном вами варианте компилироваться вроде бы будет. Но будет глючить т.к. ваши переменные в EXE непонятно куда ссылаются. EXTERNAL но не DLL.
Объяснил как мог. Народ поправит.
Обычно делается так.
В словаре или в основной DLL которая у вас AllFiles.app описываются глобальные переменные. К примеру:
GLO:Variable1 LONG
GLO:Variable2 LONG
Тогда в любых остальных DLL и EXE они описываются как
GLO:Variable1 LONG,EXTERNAL,DLL
GLO:Variable2 LONG,EXTERNAL,DLL
Получаются общие глобальные переменные, память для которых выделяется в DLL AllFiles.app
Для THREAD переменных добавляем атрибут THREAD
В словаре или в основной DLL которая у вас AllFiles.app описываются глобальные переменные. К примеру:
GLO:Variable3 LONG,THREAD
Тогда в любых остальных DLL и EXE они описываются как
GLO:Variable3 LONG,EXTERNAL,DLL,THREAD
В описанном вами варианте компилироваться вроде бы будет. Но будет глючить т.к. ваши переменные в EXE непонятно куда ссылаются. EXTERNAL но не DLL.
Объяснил как мог. Народ поправит.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
-
- Полимат
- Сообщения: 1810
- Зарегистрирован: 25 Март 2009, 21:55
- Благодарил (а): 24 раза
- Поблагодарили: 10 раз
Перенос Global Data
Я же дурак, как в камасутре написано


- Вложения
-
- dll4.jpg (8.07 КБ) 4172 просмотра
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Перенос Global Data
Clarion с INI коряво работает.
А корявость в том что не вижу как указать что бы настройки хранились в одном файле в указанной директории CSIDL_LOCAL_APPDATA
Ваш вариант наверное такой: В этом случае создастся папка
C:\Users\[username]\AppData\Local\MyProg\
и в ней для каждой APP будет свой INI файл:
AllFiles.ini
my.ini
У нас в программах мы используем 2 INI файла
Сами задаем путь для локального INI в CSIDL_LOCAL_APPDATA
И глобальный INI в папке с программой
P.S. Локальный INI - INI файл пользователя.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Перенос Global Data
INI менеджер в каждой APP по моему свой. Соответственно во всех APP настройки INI можете указывать разные. Или одинаковые. Тут по желанию.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Перенос Global Data
Реестр не люблю т.к. у клиента может не быть прав на regedit.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
-
- Полимат
- Сообщения: 1810
- Зарегистрирован: 25 Март 2009, 21:55
- Благодарил (а): 24 раза
- Поблагодарили: 10 раз
Перенос Global Data
спасибо, очень интересно и много о чём не задумывался, но меня в данном случае волнует кнопка Preserve, достаточно будет указать сохраняемые параметры глоб. данных только в allfiles или их надо дублицировать в каждой dll и в exe файле?
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
-
- ✯ Ветеран ✯
- Сообщения: 5159
- Зарегистрирован: 28 Май 2009, 15:54
- Откуда: Москва
- Благодарил (а): 11 раз
- Поблагодарили: 26 раз
Перенос Global Data
Посмотрел у себя, всё хранится в ini с названием exe-шника. Если явно не указано.
We are hard at work… for you. 

- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Перенос Global Data
По логике, в любом одном файле DLL или EXE
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Перенос Global Data
Если Clarion 10 и у вас мультидлл приложение и вы специально ничего не делали и настройки как на скриншоте - для каждого EXE или DLL файла создастся отдельный INI файл.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Перенос Global Data
Переменная у вас одна! их не несколько. В одном месте она определена а в других только ссылки на нее.
Соответственно в каком APP вы не восстановили бы ее значение, во всех остальных оно будет такое же.
Есть некоторые моменты, типа того что в случае использования Preserve вы должны понимать что значения в глобальных переменных будут не сразу на старте программы а после кода инициализации INIMgr.Init и запишутся на INIMgr.Kill
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
-
- Полимат
- Сообщения: 1810
- Зарегистрирован: 25 Март 2009, 21:55
- Благодарил (а): 24 раза
- Поблагодарили: 10 раз
Перенос Global Data
по логике да, ini файл будет с именем my.exekreator писал(а):Посмотрел у себя, всё хранится в ini с названием exe-шника. Если явно не указано.
да, на С10 перебираюсь потихоньку и поэтому боюсь "вляпаться", так как новоеAdmin писал(а):Если Clarion 10 и у вас мультидлл приложение и вы специально ничего не делали и настройки как на скриншоте - для каждого EXE или DLL файла создастся отдельный INI файл.

“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Перенос Global Data
Да. Кажется немного не прав. Давно со стандартными INI не работал.
Создаются файлы для всех DLL, видать косяк в реализации. Файлы с кодом:
Код: Выделить всё
[__Dont_Touch_Me__]
Sectors=0
Т.к. все DLL при инициализации получают экземпляр INIMgr от EXE файла.
P.S. Немного намутили с INI велосипеды. Инитят локальный класс менеджера а потом перекрывают его классом из EXE. Вот при инициализации локального пустой INI для DLL и создается. Нужно было INI создавать при первом использовании а не сразу в Init. Тогда было бы все красиво.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
- Admin
- Администратор
- Сообщения: 4010
- Зарегистрирован: 05 Июль 2005, 15:59
- Откуда: Хабаровск
- Благодарил (а): 53 раза
- Поблагодарили: 33 раза
- Контактная информация:
Перенос Global Data
И кстати не стал пользоваться Preserve по той причине что там логика чтения записи простая. Есть данные в INI - прочитаем их, нет данных вернем пусто. Т.е. обнулит дефолтовое значение в переменной.
Мне больше нравится
Код: Выделить всё
Glo:InDictionary1 = SELF.TryFetch('Preserved','Glo:InDictionary1')
Код: Выделить всё
Glo:InDictionary1 = SELF.TryFetch('Setup', 'Glo:InDictionary1', Glo:InDictionary1, [INIFileWithPath])
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
-
- Полимат
- Сообщения: 1810
- Зарегистрирован: 25 Март 2009, 21:55
- Благодарил (а): 24 раза
- Поблагодарили: 10 раз
Перенос Global Data
насчет Preserve согласен, а где тогда вставка кода должна быть вместо Preserve, чтобы не "спотыкаться" в дальнейшем?
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп