Перенос Global Data

Clarion, Clarion 7

Модератор: Дед Пахом

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
gopstop2007
Полимат
Сообщения: 1810
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 24 раза
Поблагодарили: 10 раз

Перенос Global Data

Сообщение gopstop2007 »

Возвращаюсь к глобальным данным. :) Создал по примеру в кларионе dlltutor, allfiles.dll, в my.app выставил крыжики в глобальных настройках (см. скриншот 1 и 2). Скопировал все глобальные данные из my.app в allfiles.dll. Глобальные данные которые были в my.app, выставил (см. скриншот 3). Добавил в my.app полученную allfiles.lib, скомпилировал все это, без ошибок. При запуске my.exe выдает ошибку?! Мне кажется проблема связана с глобальными данными, может чего упустил?
Вложения
в my.app выставил крыжики в глобальных настройках
в my.app выставил крыжики в глобальных настройках
dll1.jpg (11.53 КБ) 4188 просмотров
и еще
и еще
dll2.jpg (9.36 КБ) 4188 просмотров
в глобальных данных которые были в my.app
в глобальных данных которые были в my.app
dll3.jpg (4.2 КБ) 4188 просмотров
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Перенос Global Data

Сообщение Admin »

Никогда не делал 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
2015-10-25 19-17-47 Application.png
MultiDLL.zip
(114.26 КБ) 81 скачивание
В описанном вами варианте компилироваться вроде бы будет. Но будет глючить т.к. ваши переменные в EXE непонятно куда ссылаются. EXTERNAL но не DLL.

Объяснил как мог. Народ поправит.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
gopstop2007
Полимат
Сообщения: 1810
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 24 раза
Поблагодарили: 10 раз

Перенос Global Data

Сообщение gopstop2007 »

Admin писал(а): Никогда не делал EXTERNAL, THREAD. Не знаю для чего это нужно.
Я же дурак, как в камасутре написано :D Спасибо, исправил, и о чудо, все пошло :) Еще вопрос, который мне не дает покоя, как быть с использованием (см. ниже) необходимо в allfiles или my.app?
Вложения
dll4.jpg
dll4.jpg (8.07 КБ) 4172 просмотра
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Перенос Global Data

Сообщение Admin »

gopstop2007 писал(а): необходимо в allfiles или my.app?
Clarion с INI коряво работает.
А корявость в том что не вижу как указать что бы настройки хранились в одном файле в указанной директории CSIDL_LOCAL_APPDATA

Ваш вариант наверное такой:
2015-10-25 20-53-25 INI File Options.png
В этом случае создастся папка
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

Сообщение Admin »

INI менеджер в каждой APP по моему свой. Соответственно во всех APP настройки INI можете указывать разные. Или одинаковые. Тут по желанию.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Перенос Global Data

Сообщение Admin »

Реестр не люблю т.к. у клиента может не быть прав на regedit.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
gopstop2007
Полимат
Сообщения: 1810
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 24 раза
Поблагодарили: 10 раз

Перенос Global Data

Сообщение gopstop2007 »

спасибо, очень интересно и много о чём не задумывался, но меня в данном случае волнует кнопка Preserve, достаточно будет указать сохраняемые параметры глоб. данных только в allfiles или их надо дублицировать в каждой dll и в exe файле?
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
kreator
✯ Ветеран ✯
Сообщения: 5159
Зарегистрирован: 28 Май 2009, 15:54
Откуда: Москва
Благодарил (а): 11 раз
Поблагодарили: 26 раз

Перенос Global Data

Сообщение kreator »

Посмотрел у себя, всё хранится в ini с названием exe-шника. Если явно не указано.
We are hard at work… for you. :)
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Перенос Global Data

Сообщение Admin »

gopstop2007 писал(а): только в allfiles или их надо дублицировать в каждой dll и в exe файле?
По логике, в любом одном файле DLL или EXE
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Перенос Global Data

Сообщение Admin »

kreator писал(а): Посмотрел у себя, всё хранится в ini с названием exe-шника. Если явно не указано.
Если Clarion 10 и у вас мультидлл приложение и вы специально ничего не делали и настройки как на скриншоте - для каждого EXE или DLL файла создастся отдельный INI файл.
2015-10-25 22-17-29 Global Properties.png
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Перенос Global Data

Сообщение Admin »

gopstop2007 писал(а): их надо дублицировать в каждой dll и в exe файле
Переменная у вас одна! их не несколько. В одном месте она определена а в других только ссылки на нее.
Соответственно в каком APP вы не восстановили бы ее значение, во всех остальных оно будет такое же.

Есть некоторые моменты, типа того что в случае использования Preserve вы должны понимать что значения в глобальных переменных будут не сразу на старте программы а после кода инициализации INIMgr.Init и запишутся на INIMgr.Kill
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
gopstop2007
Полимат
Сообщения: 1810
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 24 раза
Поблагодарили: 10 раз

Перенос Global Data

Сообщение gopstop2007 »

kreator писал(а):Посмотрел у себя, всё хранится в ini с названием exe-шника. Если явно не указано.
по логике да, ini файл будет с именем my.exe
Admin писал(а):
Если Clarion 10 и у вас мультидлл приложение и вы специально ничего не делали и настройки как на скриншоте - для каждого EXE или DLL файла создастся отдельный INI файл.
да, на С10 перебираюсь потихоньку и поэтому боюсь "вляпаться", так как новое :) Спасибо очень помогли разобраться с некоторыми нюансами.
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Перенос Global Data

Сообщение Admin »

kreator писал(а): Посмотрел у себя, всё хранится в ini с названием exe-шника. Если явно не указано.
Да. Кажется немного не прав. Давно со стандартными INI не работал.
Создаются файлы для всех DLL, видать косяк в реализации. Файлы с кодом:

Код: Выделить всё

[__Dont_Touch_Me__]
Sectors=0
а фактически все DLL и EXE хранят данные в INI файле с именем EXE файла.
Т.к. все DLL при инициализации получают экземпляр INIMgr от EXE файла.

P.S. Немного намутили с INI велосипеды. Инитят локальный класс менеджера а потом перекрывают его классом из EXE. Вот при инициализации локального пустой INI для DLL и создается. Нужно было INI создавать при первом использовании а не сразу в Init. Тогда было бы все красиво.
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
Аватара пользователя
Admin
Администратор
Сообщения: 4010
Зарегистрирован: 05 Июль 2005, 15:59
Откуда: Хабаровск
Благодарил (а): 53 раза
Поблагодарили: 33 раза
Контактная информация:

Перенос Global Data

Сообщение Admin »

И кстати не стал пользоваться Preserve по той причине что там логика чтения записи простая. Есть данные в INI - прочитаем их, нет данных вернем пусто. Т.е. обнулит дефолтовое значение в переменной.

Код: Выделить всё

Glo:InDictionary1 = SELF.TryFetch('Preserved','Glo:InDictionary1')
Мне больше нравится

Код: Выделить всё

Glo:InDictionary1 = SELF.TryFetch('Setup', 'Glo:InDictionary1', Glo:InDictionary1, [INIFileWithPath])
Рай совершает ошибки ничуть не реже чем ад. Просто у него хорошая пресса
gopstop2007
Полимат
Сообщения: 1810
Зарегистрирован: 25 Март 2009, 21:55
Благодарил (а): 24 раза
Поблагодарили: 10 раз

Перенос Global Data

Сообщение gopstop2007 »

насчет Preserve согласен, а где тогда вставка кода должна быть вместо Preserve, чтобы не "спотыкаться" в дальнейшем?
“Есть всего 2 типа языков: те, на которые все жалуются и те, которыми никто не пользуется.” — Бьерн Страуструп
Ответить