Изготовление заглушек

Clarion, Clarion 7

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

Правила форума
При написании вопроса или обсуждении проблемы, не забывайте указывать версию Clarion который Вы используете.
А так же пользуйтесь спец. тегами при вставке исходников!!!
Ответить
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4618
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 37 раз

Изготовление заглушек

Сообщение finsoftrz »

Накидал утилиту для примера, как можно создавать заглушки. Например, у нас большая модульная система, и мы хотим по каким-то соображениям отдельным клиентам давать пустышку вместо полноценной dll. Данная утилита заменяет сырцы на сообщение заглушки. После подмены компилим. Чтобы вернуться к исходному варианту, собираем dll в режиме безусловной генерации. Развивать утилиту можно в зависимости от потребностей, это только пример, ставящий заглушку на 4 типа шаблонных процедур. Если несколько процедур на модуль, то установка заглушки определяется по первой.

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

#!====================================================================================
#UTILITY(FsMakeBlancFunctions,'Сформировать заглушки.')
#!====================================================================================
#DISPLAY('Эта утилита создает заглушки')
#DISPLAY('для всех процедур модуля')
#DISPLAY('')
#PROMPT('Window',CHECK),%FsTemplWind, DEFAULT(1), AT(5)
#PROMPT('Browse',CHECK),%FsTemplBrw, DEFAULT(1), AT(5)
#PROMPT('Frb',CHECK),%FsTemplFrb, DEFAULT(1), AT(5)
#!
#DECLARE(%FsNum)
#DECLARE(%FsOk)
#DECLARE(%FsApplication)
#DECLARE(%FsApplicationDll)
#DECLARE(%FsMess)
#DECLARE(%FsStr)
#!
#SET(%FsApplication,%Application & '.clw')
#SET(%FsApplicationDll,%Application & '.dll')
#FOR(%Module)
  #SET(%FsNum,0)
  #SET(%FsOk,0)
  #FOR(%ModuleProcedure)
    #SET(%FsNum,%FsNum+1)
    #FIX(%Procedure,%ModuleProcedure)
    #IF(%ProcedureTemplate='Window' and %FsTemplWind=1)
    #ELSIF(%ProcedureTemplate='Browse' and %FsTemplBrw=1)
    #ELSIF(%ProcedureTemplate='ReportManager(FominReportBuilder)' and %FsTemplFrb=1)
    #ELSIF(%ProcedureTemplate='RuntimeReport(FominReportBuilder)' and %FsTemplFrb=1)
    #ELSE
       #CYCLE
    #ENDIF
    #IF(%FsNum>1 and %FsOk=0)
       #BREAK
    #ENDIF   
    #IF(%FsNum=1)
      #CREATE(%ModuleBase & '.clw')
      #SET(%FsOk,1)
    #ENDIF
    #SET(%FsStr,'')
    #FOR(%ProcedureParameters)
       #IF(%FsStr<>'')
          #SET(%FsStr,%FsStr & ',')
       #ENDIF   
       #SET(%FsStr,%FsStr & %ProcedureParameterName)
    #ENDFOR
                     MEMBER('%FsApplication')
%Procedure PROCEDURE(%FsStr)                     
  CODE
     #SET(%FsMess,'Процедура отключена. Модуль ' & %FsApplicationDll & ', процедура ' & %Procedure & ' - ' & %ProcedureDescription)
     Message('%FsMess') 
     #IF(%ProcedureType='FUNCTION')
     return(0)
     #ENDIF
  #ENDFOR
  #IF(%FsOk=1)
    #CLOSE
  #ENDIF
#ENDFOR  
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7379
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Изготовление заглушек

Сообщение Игорь Столяров »

Мы делали нечто подобное, в т.ч. и для таких целей.
Что-то вроде примитивного подобия COM интерфейса.

1. Внутри DLL реализуется самодостаточный функционал (предположим 50 аналитических отчётов)
со всем необходимым для их работы.

2. Но в этом DLL только одна процедура-коннектор имеет атрибут External и через неё производится
вызов всех остальных процедур. Т.е. что-то вроде CALL_DLL4(NumberProcedure, Par1, Par2, Par3).

3. Теперь в базовую комплектацию программы кладётся "пустой" DLL с коннектором который выдаёт сообщение.
При необходимости мона докупить DLL с отчётами и тупо скопировать (установить с заменой) в папку
с программой. Никаких пересборок или упаси шаблонов. Всё просто как детская игра в крысу. :)

4. В реальности есть конечно контроль подписки, защита от воровства, частичная активация и контроль версий,
но это уже дополнительные фишки. ;)
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4618
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 37 раз

Изготовление заглушек

Сообщение finsoftrz »

Мне защищать ничего не надо. Идея для облегчения дистрибутива. Сейчас основное приложение после запуска отъедает 100+ мб оперативки. Это костяк, дополнительные отчёты и обработки ещё могут подгружаться по мере надобности. Если у нас клиент продаёт хозку, то ему в основной базе не нужно производство, зарплата, бухгалтерия и тп. Если их заглушить, то сдуется раза в 2 точно. Я давно вёл заглушки в отдельных app, но это неудобно. Потом забил, так как на терминальных серверах dll загружаются один раз и расшариваются между всеми пользователями, а exe маленький. С другой стороны, иметь в арсенале возможность в несколько щелчков собрать заглушку выглядит неплохо.

Ещё была мысль заглушить frb, чтобы собрать основной проект с рантаймом с11 в тестовых целях. Это мои внутренние заморочки. На FRB было много бланков сделано, и хотя сейчас все формы сконвертированы на свой аналог, перевнедрять у клиентов давно находящиеся в реальной работе бланки мотивации особо нет. Не уверен, что в этом плане утилита пригодится, все же рантайм с11 содержит много недоработок и ошибок, желание связываться с ним отпадает каждый раз после очередного захода на тестирование.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4618
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 37 раз

Изготовление заглушек

Сообщение finsoftrz »

Ещё обращу внимание, что символ %ProcedureParameters, используемый в шаблоне, появился после с6. Если аналогичную методику использовать в с6, то надо идти от прототипа, тоже решается, но сложнее.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4618
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 37 раз

Изготовление заглушек

Сообщение finsoftrz »

Игорь Столяров писал(а): 06 Июнь 2023, 22:01 3. Теперь в базовую комплектацию программы кладётся "пустой" DLL с коннектором который выдаёт сообщение.
При необходимости мона докупить DLL с отчётами и тупо скопировать (установить с заменой) в папку
с программой. Никаких пересборок или упаси шаблонов. Всё просто как детская игра в крысу. :)
Такой подход имеет обратную сторону, снижается надёжность кода и можно легко на сбои при работе приложения попасть. Компилятор уже не отследит ошибки в вызовах процедур из такой dll.
Для дополнительных отчётов и обработок, не входящих в базовый функционал, я использую подгружаемые dll. Но с прикладными модулями сложнее, в них много чего может быть, и это взаимоувязано с другими модулями.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7379
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Изготовление заглушек

Сообщение Игорь Столяров »

finsoftrz писал(а): 07 Июнь 2023, 8:27 имеет обратную сторону, снижается надёжность кода
Тут как бы и да и нет. :) Манипулирование фрагментами проекта требует контроля версий и т.д.
Но ведь можно рассмотреть и другую сторону:
- Предположим у нас некий т.н. "большой" проект с кол-во DLL равное X;
- Предположим, что в каждой такой DLL находится Y процедур с атрибутом External.
- И вот у нас уже в заглавной APP (для EXE) находится (X * Y) External линков для вызова процедур из DLL ... :(
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4618
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 37 раз

Изготовление заглушек

Сообщение finsoftrz »

На самом деле линков намного меньше, в основном, только то, что запускается из меню фрейма.
Про контроль версий не очень понял применительно к данной ситуации. Если добавился параметр у вызываемой процедуры, или изменился тип параметра, или в вызове передали неправильный параметр, как это отследить? Я понимаю, что безопасность кода 100% не бывает, просто лучше минимизировать по возможности вероятность ошибок. В контексте клариона, чтобы код максимально мог быть верифицирован компилятором, а содержимое dct и app максимально прозрачно для языка темплейтов.
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Игорь Столяров
Ветеран движения
Сообщения: 7379
Зарегистрирован: 07 Июль 2005, 10:19
Откуда: г. Ростов-на-ДоМу
Благодарил (а): 13 раз
Поблагодарили: 48 раз

Изготовление заглушек

Сообщение Игорь Столяров »

finsoftrz писал(а): 07 Июнь 2023, 10:53 Если добавился параметр у вызываемой процедуры
Нет. Защита от дурака - это иная задача. Я говорил именно о контроле версий.
Если проект и DLL были собраны с разными версиями RunTime, то это всё может очень забавно работать.
Мы как-то обсуждали это в отдельной теме: viewtopic.php?t=4844&start=15
За теми кто отстал - не возвращаться. (С) Кодекс
Аватара пользователя
RaFaeL
✯ Ветеран ✯
Сообщения: 1378
Зарегистрирован: 24 Март 2009, 17:59
Откуда: НН
Благодарил (а): 7 раз
Поблагодарили: 1 раз
Контактная информация:

Изготовление заглушек

Сообщение RaFaeL »

Не надо "фигарить 50 форм за раз", и не потребуется ставить заглушки )
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4618
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 37 раз

Изготовление заглушек

Сообщение finsoftrz »

Можно драйвера на сях разрабатывать, тогда формы вообще не нужны. :-)
C6/C11, ШВС, tps/btrieve.
Аватара пользователя
Губин Игорь
✯ Ветеран ✯
Сообщения: 2329
Зарегистрирован: 16 Сентябрь 2005, 16:35
Откуда: Москва
Поблагодарили: 18 раз

Изготовление заглушек

Сообщение Губин Игорь »

Я делаю проще, использую ommit и compile по параметрам в app. Это более гибко, позволяет держать несколько уровней возможностей в модуле, собирая как из кубиков. Ну и сообщения делаются более понятными. Поскольку мало сообщить, что у вас нет прав на какой-то модуль, но и нормальным языком сообщить на какой. Иначе пользователи достают вопросами "я же купил, а у меня не работает?!"
Это я только кажусь дураком! На самом деле я полный идиот!
Аватара пользователя
finsoftrz
✯ Ветеран ✯
Сообщения: 4618
Зарегистрирован: 06 Ноябрь 2014, 12:48
Благодарил (а): 6 раз
Поблагодарили: 37 раз

Изготовление заглушек

Сообщение finsoftrz »

Сообщения аналогично:
#SET(%FsMess,'Процедура отключена. Модуль ' & %FsApplicationDll & ', процедура ' & %Procedure & ' - ' & %ProcedureDescription)
Не очень понял, фактически код процедур остается в dll (отключается вызов) или ты его совсем исключаешь? Я делал, чтобы уменьшить размер кода, а не ограничить доступ к нему.
C6/C11, ШВС, tps/btrieve.
Ответить