Форум » [x]Harbour » Вопрос по Hrb-файлам » Ответить
Вопрос по Hrb-файлам
alex_II: Редко используемые модули программы я компилирую в Hrb-файлы и по мере надобности подгружаю во время выполнения. Создаю так: ...harbour prin_25 -es2 -gh -i -kh -m -n -iD:\MiniGUI\harbour\include;D:\MiniGUI\include -DHRBYES Подгружаю: hnd := hb_hrbLoad(prin_25) prn_25() hb_hrbUnload(hnd) Всё работает штатно, но столкнулся с проблемой, команды из библиотеки ct3.lib не поддерживаются. Я столкнулся пока с двумя FileSize и CharOne. Как выйти из этой ситуации, или это ограничения Hrb-файлов?
Ответов - 13
alkresin: Надо, чтобы программа была собрана с этими функциями. Для этого: 1. Она должна быть собрана с ct3.lib 2. В коде (основной программы, не hrb) должны присутствовать REQUESTы с именами этих функций
alex_II: Все нужные библиотеки присутствуют. Я могу собрать как с Hrb-файоами, так и без них. Если собрано всё в один модуль, проблем нет
alkresin: Если собраны в 1 модуль, вызов этих функций присутствует в коде и они прилинковываются. Если их в коде основного модуля нет (как в случае с hrb), то надо поставить REQUESTы.
alex_II: Проблему решил использовав для функции FileCopy описание: EXTERNAL FileCopy
SergKis: alex_II пишет Проблему решил использовав для функции FileCopy описание: EXTERNAL FileCopy Можно использовать еще hb_FCopy и hb_vfCopyFile, сделав REQUEST https://github.com/Petewg/harbour-core/wiki Для CharOne подключить hbct.lib и REQUEST CharOne Все должно быть доступно в hrb
Andrey: А можно сразу *.prg файл запускать у себя в программе ? Открыть/создать базу, посчитать что-то в базе.
gfilatov2002: Andrey пишет: можно сразу *.prg файл запускать у себя в программе ? Да, это возможно. Подробности о встроенном компиляторе здесь
Dima: Andrey пишет: А можно Можно Надо прилинковать либу hbcplr.lib и юзать например hb_compileFromBuf , подробности читай в доке у Кресина
Dima: gfilatov2002 Опередил
Andrey: Что-то не работает... Вылетает с ошибкой: [pre2]Error BASE/6103 Неверный аргумент: HB_HRBRUN Args: [1] = U --------------------------------- Stack Trace --------------------------------- Called from HB_HRBRUN(0) Called from PRGRUN(205) in module: form_prg_run.prg Called from (b)FORM_PRGRUN(160) in module: form_prg_run.prg Called from DO_WINDOWEVENTPROCEDURE(105) in module: h_objmisc.prg[/pre2] Вот код: [pre2] cText := HB_MemoRead( cFileName ) ? cText buf := hb_compilebuf( "harbour", cFileName, "/n","/w" ) // Компилируем MsgDebug(LEN(cText),cFileName,buf) hb_hrbRun( buf ) // исполняем [/pre2] MsgDebug() выдает 3412, имя файла, NIL Пример - SAMPLES\Advanced\RunScript Там тоже пишет ошибку по кнопке 'Run Script From Variable' [pre2] cByteCode := hb_compileBuf( "harbour", "LibPRG.prg", "-n", "-w3", "-es2", "-q0", "-IC:\Minigui\harbour\include", "-IC:\Minigui\include" ) [/pre2]
Andrey: Разобрался с hb_compilebuf(). У меня первым стартует xHarbour, из-за этого и не та компиляция. Беру окружение МиниГуи и ставлю правильные пути. [pre2] cMGpath := GetEnv( 'MG_ROOT' ) cCompiler := cMGpath + "\Harbour\bin\harbour.exe" cIncHrb := "-I" + cMGpath + "\harbour\include" cIncMG := "-I" + cMGpath + "\include" ... cByteCode := hb_compileBuf( cCompiler, cFileName, "-n", "-w3", "-es2", "-q0", cIncHrb, cIncMG ) // Компилируем[/pre2] Вопрос другой возник, а как bat файл сделать, чтобы создавать .hrb ? Что-то у меня не получается...
Andrey: Разобрался... call C:\MiniGui\batch\hbmk2.bat /n /w3 /es2 /q0 /gh %* -lhmgaddon -lrddleto Как эту строку перенести в код ? Делаю так: Выдаёт ошибку, т.к. не может понять что нужно прилинковать 2 библиотеки: -lhmgaddon -lrddleto [pre2] cCompiler := cMGpath + "\Harbour\bin\harbour.exe" cIncHrb := "-I" + cMGpath + "\harbour\include" cIncMG := "-I" + cMGpath + "\include" //cLibMG := "-l" + cMGpath + "\Lib\hmgaddon " + "-l" + cMGpath + "\Lib\rddleto" // не работает cLibMG := "-lhmgaddon -lrddleto" cByteCode := hb_compilebuf( cCompiler, cFileName, "-n", "-w3", "-es2", "-q0", cIncHrb, cIncMG, cLibMG ) // НЕ Компилируется, выдаёт NIL !!! если ставлю так, то вроде работает: cByteCode := hb_compileBuf( cCompiler, cFileName, "-n", "-w3", "-es2", "-q0", cIncHrb, cIncMG ) [/pre2]
Andrey: cLibMG := "-lhmgaddon -lrddleto" Библиотеки оказывается не нужны... Без них .prg/hrb будет работать - самое главное чтобы нужные библиотеки были прилинкованы в ехе-нике из которого стартует .prg/hrb + все нужные функции перечислены в проге, где будет запускаться этот .prg/hrb типа такого в начале допустим form_run_script.prg [pre2]#include "hmg.ch" #include "hbextern.ch" #include "hbhrb.ch" // ВНИМАНИЕ !!! Здесь надо перечислить все функции которые будут использованы в вызываемых примерах REQUEST DBORDERINFO, ORDLISTCLEAR, ORDBAGCLEAR, ORDDESTROY REQUEST DbSetIndex, DbClearIndex, DBCLEARREL, DBCREATE, DBUSEAREA REQUEST DBORDERINFO, ORDLISTCLEAR, ORDBAGCLEAR, ORDDESTROY REQUEST LETO, LETO_CONNECT, LETO_CONNECT_ERR REQUEST HB_STRTOTS, STOT ....[/pre2] БОЛЬШОЕ СПАСИБО gfilatov2002 и alkresin
полная версия страницы