Автор | Сообщение |
|
| постоянный участник
|
Пост N: 35
Зарегистрирован: 12.09.06
|
|
Отправлено: 15.10.06 03:09. Заголовок: Как узнать есть ли функция в программе ?
Всем привет ! А можно ли узнать, есть ли определенная функция в этом exe-нике или нет, т.е. перед вызовом функции проверять как-то ? Я сценарий программы храню в ini-файле, и по ходу выполнения программы вызываю ту или иную функцию. А если этой функции нет, то программа просто сваливается, а я хочу чтобы не валилась. Кто знает, подскажите.
|
|
|
Ответов - 14
[только новые]
|
|
|
| |
Пост N: 66
Зарегистрирован: 17.10.05
|
|
Отправлено: 15.10.06 09:41. Заголовок: Re:
cT := Type( cFuncName + '()' ) IF .NOT.( cT == 'UI' .OR. cT == 'UE' ) MsgExclamation( 'Функции нет в EXE' ) endif
|
|
|
|
| постоянный участник
|
Пост N: 36
Зарегистрирован: 12.09.06
|
|
Отправлено: 15.10.06 12:02. Заголовок: Re:
Спасибо большое !
|
|
|
|
| |
Пост N: 30
Зарегистрирован: 07.08.06
|
|
Отправлено: 16.10.06 03:10. Заголовок: Re:
Я делаю так (обращаю внимание, что функция type() может вернуть "UI", но функция при этом ЕСТЬ в экзешнике! поэтому условие её ПРИСУТСТВИЯ -- любой тип возврата, за исключениием "U" и "UE"): local dummyVar priv someFunc ... someFunc="testFunc(val1,val2,'stringPar1','stringPar2)" if ','+type(someFunc)+',' $ ',U,UE,' msg('Программный код не разработан или отсутствует!') else dummyVar = &someFunc end
|
|
|
|
| |
Пост N: 7
Зарегистрирован: 23.10.06
|
|
Отправлено: 23.10.06 16:18. Заголовок: Re:
ну да) обидно только, если type("xfunc()") сделает ВЫЗОВ этой функции, в то время, как этого не требуется зы. в какой-то библе от рытова вроде были функции CHECK_SYM и иже с ними
|
|
|
|
| |
Пост N: 32
Зарегистрирован: 07.08.06
|
|
Отправлено: 23.10.06 23:04. Заголовок: Re:
Что-то я не припомню НИ ОДНОГО случая такого самопроизвольного вызова. У меня в исходниках в нескольких местах проверяется наличие ф-ции, отвечающей за действия программы в случае её завершения (эта ф-ция называется "QUITPRG()"). Если бы она вызывалась, то прога тут же бы и завершалась, не успев толком ничего выполнить.
|
|
|
|
| |
Пост N: 13
Зарегистрирован: 23.10.06
|
|
Отправлено: 28.10.06 13:23. Заголовок: Re:
type("inkey(0)")
|
|
|
|
| |
Пост N: 417
Зарегистрирован: 17.05.05
|
|
Отправлено: 29.10.06 19:17. Заголовок: Re:
suv пишет: этот пример падает с internal error 999
|
|
|
|
| |
Пост N: 52
Зарегистрирован: 06.06.06
|
|
Отправлено: 30.10.06 11:04. Заголовок: Re:
Dima пишет: цитата: | этот пример падает с internal error 999 |
| А у меня не падает - результат "N".
|
|
|
|
| |
Пост N: 418
Зарегистрирован: 17.05.05
|
|
Отправлено: 30.10.06 12:33. Заголовок: Re:
ort пишет: цитата: | А у меня не падает - результат "N". |
| у меня Clipper 5.2e
|
|
|
|
| |
Пост N: 53
Зарегистрирован: 06.06.06
|
|
Отправлено: 30.10.06 12:58. Заголовок: Re:
Dima пишет: У меня точно такой же!
|
|
|
|
| |
Пост N: 46
Зарегистрирован: 08.07.06
|
|
Отправлено: 15.11.06 18:00. Заголовок: Re:
а чем не вариант: ****************************************** FUNC NameIsLinked(cFunc) LOCAL x,y,result x:=ERRORBLOCK({||BreakFunc()}) BEGIN SEQUENCE y := &cFunc // нужно вызвать, полюбому... result := TRUE // не вылетело по ошибке RECOVER result := FALSE // был вылет по ошибке END SEQUENCE ERRORBLOCK(x) // восстанавливаем станд.обработчик RETURN result *************************** FUNC BreakFunc() BREAK RETURN *************************** не тестировал, но общий смысл, надеюсь, понятен.
|
|
|
|
|
| постоянный участник
|
Пост N: 241
Зарегистрирован: 17.05.05
|
|
Отправлено: 15.11.06 18:35. Заголовок: Re:
А если совсем не нужно вызывать функцию, а лишь узнать, имеется она или нет?
|
|
|
|
| |
Пост N: 14
Зарегистрирован: 22.03.06
|
|
Отправлено: 16.11.06 10:58. Заголовок: Re:
Григорьев Владимир пишет: цитата: | А если совсем не нужно вызывать функцию, а лишь узнать, имеется она или нет? |
| Можно воспользоваться функциями FIRSTSYM и NextSym из библиотеки USERLIB файл NEXTSYM.C цитата: | /* Автор: Алексей Рытов, г. Ленинград, 1991 Тема: Использование недокументированных функций CLIPPER 5.0 Раздел: Таблица символов Функция: Просмотр таблицы символов */ |
| или же функция SymInfo оттуда же цитата: | Назначение: По имени символа получить строку, характеризующую использование этого символа в программе. Вызов: SymInfo( cName ) -> cInfo Параметры: cName - строка имени символа Результат: Строка, составленная из символов, отражающих использова- ние имени cName в CLIPPER-программе: 'F' - имя поля, 'A' - имя рабочей области 'm' - имя PRIVATE-переменной 'M' - имя PUBLIC-переменной 'P' - имя процедуры. В файле: SYMINFO.C |
|
|
|
|
|
| |
Пост N: 28
Зарегистрирован: 27.04.06
|
|
Отправлено: 16.11.06 16:32. Заголовок: Re:
А где эта библиотека USERLIB, автор: Алексей Рытов ?
|
|
|
|