Страница 2 из 3
Перенос Global Data
Добавлено: 25 Октябрь 2015, 11:15
gopstop2007
Возвращаюсь к глобальным данным.

Создал по примеру в кларионе dlltutor, allfiles.dll, в my.app выставил крыжики в глобальных настройках (см. скриншот 1 и 2). Скопировал все глобальные данные из my.app в allfiles.dll. Глобальные данные которые были в my.app, выставил (см. скриншот 3). Добавил в my.app полученную allfiles.lib, скомпилировал все это, без ошибок. При запуске my.exe выдает ошибку?! Мне кажется проблема связана с глобальными данными, может чего упустил?
Перенос Global Data
Добавлено: 25 Октябрь 2015, 12:29
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
В описанном вами варианте компилироваться вроде бы будет. Но будет глючить т.к. ваши переменные в EXE непонятно куда ссылаются. EXTERNAL но не DLL.
Объяснил как мог. Народ поправит.
Перенос Global Data
Добавлено: 25 Октябрь 2015, 13:39
gopstop2007
Admin писал(а): Никогда не делал EXTERNAL, THREAD. Не знаю для чего это нужно.
Я же дурак, как в камасутре написано

Спасибо, исправил, и о чудо, все пошло

Еще вопрос, который мне не дает покоя, как быть с использованием (см. ниже) необходимо в allfiles или my.app?
Перенос Global Data
Добавлено: 25 Октябрь 2015, 13:57
Admin
gopstop2007 писал(а): необходимо в allfiles или my.app?
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 файл пользователя.
Перенос Global Data
Добавлено: 25 Октябрь 2015, 14:01
Admin
INI менеджер в каждой APP по моему свой. Соответственно во всех APP настройки INI можете указывать разные. Или одинаковые. Тут по желанию.
Перенос Global Data
Добавлено: 25 Октябрь 2015, 14:04
Admin
Реестр не люблю т.к. у клиента может не быть прав на regedit.
Перенос Global Data
Добавлено: 25 Октябрь 2015, 14:49
gopstop2007
спасибо, очень интересно и много о чём не задумывался, но меня в данном случае волнует кнопка Preserve, достаточно будет указать сохраняемые параметры глоб. данных только в allfiles или их надо дублицировать в каждой dll и в exe файле?
Перенос Global Data
Добавлено: 25 Октябрь 2015, 15:06
kreator
Посмотрел у себя, всё хранится в ini с названием exe-шника. Если явно не указано.
Перенос Global Data
Добавлено: 25 Октябрь 2015, 15:13
Admin
gopstop2007 писал(а): только в allfiles или их надо дублицировать в каждой dll и в exe файле?
По логике, в любом одном файле DLL или EXE
Перенос Global Data
Добавлено: 25 Октябрь 2015, 15:18
Admin
kreator писал(а): Посмотрел у себя, всё хранится в ini с названием exe-шника. Если явно не указано.
Если Clarion 10 и у вас мультидлл приложение и вы специально ничего не делали и настройки как на скриншоте - для каждого EXE или DLL файла создастся отдельный INI файл.
Перенос Global Data
Добавлено: 25 Октябрь 2015, 15:26
Admin
gopstop2007 писал(а): их надо дублицировать в каждой dll и в exe файле
Переменная у вас одна! их не несколько. В одном месте она определена а в других только ссылки на нее.
Соответственно в каком APP вы не восстановили бы ее значение, во всех остальных оно будет такое же.
Есть некоторые моменты, типа того что в случае использования Preserve вы должны понимать что значения в глобальных переменных будут не сразу на старте программы а после кода инициализации INIMgr.Init и запишутся на INIMgr.Kill
Перенос Global Data
Добавлено: 25 Октябрь 2015, 15:28
gopstop2007
kreator писал(а):Посмотрел у себя, всё хранится в ini с названием exe-шника. Если явно не указано.
по логике да, ini файл будет с именем my.exe
Admin писал(а):Если Clarion 10 и у вас мультидлл приложение и вы специально ничего не делали и настройки как на скриншоте - для каждого EXE или DLL файла создастся отдельный INI файл.
да, на С10 перебираюсь потихоньку и поэтому боюсь "вляпаться", так как новое

Спасибо очень помогли разобраться с некоторыми нюансами.
Перенос Global Data
Добавлено: 25 Октябрь 2015, 15:33
Admin
kreator писал(а): Посмотрел у себя, всё хранится в ini с названием exe-шника. Если явно не указано.
Да. Кажется немного не прав. Давно со стандартными INI не работал.
Создаются файлы для всех DLL, видать косяк в реализации. Файлы с кодом:
а фактически все DLL и EXE хранят данные в INI файле с именем EXE файла.
Т.к. все DLL при инициализации получают экземпляр INIMgr от EXE файла.
P.S. Немного намутили с INI велосипеды. Инитят локальный класс менеджера а потом перекрывают его классом из EXE. Вот при инициализации локального пустой INI для DLL и создается. Нужно было INI создавать при первом использовании а не сразу в Init. Тогда было бы все красиво.
Перенос Global Data
Добавлено: 25 Октябрь 2015, 15:40
Admin
И кстати не стал пользоваться Preserve по той причине что там логика чтения записи простая. Есть данные в INI - прочитаем их, нет данных вернем пусто. Т.е. обнулит дефолтовое значение в переменной.
Код: Выделить всё
Glo:InDictionary1 = SELF.TryFetch('Preserved','Glo:InDictionary1')
Мне больше нравится
Код: Выделить всё
Glo:InDictionary1 = SELF.TryFetch('Setup', 'Glo:InDictionary1', Glo:InDictionary1, [INIFileWithPath])
Перенос Global Data
Добавлено: 25 Октябрь 2015, 15:52
gopstop2007
насчет Preserve согласен, а где тогда вставка кода должна быть вместо Preserve, чтобы не "спотыкаться" в дальнейшем?