Для программ с одинаковыми именами в одном и том же списке библиотек, как активно контролировать, какую из них вызывать? - PullRequest
1 голос
/ 02 февраля 2012

У меня есть три библиотеки, A, B и C. Их порядок в библиотеке: A сверху B и B поверх C. В библиотеке A есть программа Pa, а в библиотеке B. - программа Pb.и Pb имеют одинаковое имя и список параметров, но их функции немного отличаются.Теперь в библиотеке C есть программа Pc, которая вызывает Pa. Но для достижения желаемого результата следует вызвать Pb.Проблема в том, что библиотеку A нельзя удалить из списка библиотек и нельзя переместить в библиотеку B, а Pa нельзя удалить из библиотеки A. Так можно ли как-то скрыть Pa и заставить вместо этого Pc вызывать Pb?Имена библиотек программ не могут быть закодированы в программе, поэтому все должно решаться во время выполнения.

Ответы [ 3 ]

3 голосов
/ 02 февраля 2012

Когда вы говорите Имена программных библиотек не могут быть закодированы в программе Вы имеете в виду, что это из-за стандартов магазина или сложно из-за внедрения? Или что-то еще, что делает это нежелательным?

Есть несколько подходов. Я не знаю, на каком языке вы пишете, поэтому для иллюстрации буду использовать псевдокод.

1) Подпрограммы

 when condition = A
   do subrA
 when condition = B
   do subrB
 ...

 subrA
   call libA/pgmA parm(...)

 subrB
   call libB/pgmB parm(...)

2) Динамические звонки

 define command char 128

 when condition = A
   command = 'call liba/pgma parm('
 when condition = B
   command = 'call libb/pgmb parm('
 end

 command = command + parm1 + ' ' + parm2 + ')'
 call qcmdexc (command 128)

Это лучше всего работает, если вызываемая программа не возвращает значение вызывающей стороне.

2 голосов
/ 02 февраля 2012

Вы спрашиваете, можете ли вы заставить систему переопределить список библиотек, не сообщая системе, какую библиотеку использовать. Я не знаю, как это было бы возможно.

Я думаю, что вам нужно будет квалифицировать вызов вашей программы в библиотеке B. Если вы не можете жестко закодировать имя библиотеки в вашей программе, возможно, вы можете каким-то образом софткодировать его.

/* CL example */
dcl &libname *char 10
rtvdtaara dtaara(WHICH_LIB) rtnvar(&libname)
call pgm(&libname/PGMNAME) parm(...)

Так что теперь, помимо ведения списка библиотек, вы должны поддерживать эту область данных (или то, что вы используете для хранения имени библиотеки).

1 голос
/ 05 апреля 2014

Список библиотек состоит из четырех компонентов: системная часть, библиотеки продуктов, текущая библиотека и пользовательская часть.При нормальных обстоятельствах система не должна изменяться.(Это должно быть ограничено от модификации.) Но все остальные части открыты.

Наиболее вероятное место будет в разделе "библиотеки продуктов".Это может содержать две библиотеки, хотя чаще всего видят одну или ни одной.Если вы создаете объект * CMD или * MENU, вы можете назначить для него библиотеку продуктов.(Также можно установить текущую библиотеку.) Таким образом, для команды при каждом запуске этой команды соответствующая библиотека продуктов добавляется в список библиотек до ее завершения.В это время библиотека удаляется.Если это программы CL, возможно, что библиотеки добавляются и удаляются из списка библиотек регулярно, независимо от того, знаете вы это или нет.

Общая логика для библиотек продуктов заключается в добавлении библиотеки в первое открытое место.,Если оба места заняты, то найдите верхнюю библиотеку, переместите нижнюю вверх и добавьте свою библиотеку внизу.Когда ваша программа завершает работу, выполните обратный процесс, чтобы библиотеки продуктов были такими же, какими они были при запуске.

Библиотеки продуктов находятся выше текущей библиотеки и пользовательской части в списке библиотек.Используйте API изменения списка библиотек (QLICHGLL) для установки библиотек продуктов.

...