Форум » [x]Harbour » Использование динамических DLL в консольных приложениях » Ответить

Использование динамических DLL в консольных приложениях

Aleksandr_D: Использование динамических DLL в консольных приложениях. Собрал DLL - NC.DLL - hbmk2 *.HBP -hbdynvm -lhbct -lhbmainstd -lharbour-32-bcc -lhbmaindllp NC /b /n /q /dDEBUG Вызов в основной программе: hLib := hb_LibLoad( "NC.DLL" ) if !empty( hLib ) && Функции не отрабатывают. xx := HB_DYNCALL({'FileMan1', "NC.DLL"}) hb_DynCall( { 'FileMan1', hLib, HB_DYN_CALLCONV_CDECL }) && Падает по ошибке Error BASE/1001 Undefined function: FILEMAN1 DO('FileMan1') FileMan1() endif hb_LibFree( hLib ) При вызове ошибка: Error BASE/1001 Undefined function: FILEMAN1

Ответов - 23 новых, стр: 1 2 All

Петр: Судя по всему, идет речь о pcode dll в [x]Harbour Ошиблись разделом. И вообще.. Если не изменяет память, должно быть как-то так [pre] DYNAMIC FILEMAN1 PROCEDURE Main() LOCAL l := hb_libLoad( hb_libName( "nc" ) ) IF !Empty( l ) FILEMAN1() hb_LibFree( hLib ) ENDIF RETURN[/pre]

Aleksandr_D: Не получилось. Опять ошибка. Error BASE/1001 Undefined function: FILEMAN1

Andrey: Вот делал пример для МиниГуи и C++ https://cloud.mail.ru/public/JWHz/xCvn6Jycy Может поможет.


Aleksandr_D: Андрей, спасибо! Вызовы из системных Dll получается, например: xx := hb_DynCall( { "MessageBoxA", "user32.dll", HB_DYN_CALLCONV_STDCALL}, c1 ,; c2 ,; hb_bitOr( MB_OKCANCEL, MB_ICONEXCLAMATION ) ) Вызов функции из моей DLL hLib := hb_libLoad( hb_libName( 'E:\TEST_H\NC.DLL' ) ) xx := hb_DynCall( { 'FileMan1', hLib, HB_DYN_CALLCONV_SYSCALL }) возвращает NiLL. А мне нужно вызвать ф-цию которая, например строит отчет по данным системы. Я хочу перевести довольно большую систему написанную на Clipper 5,2 (сборка Blinker) на Харбор. Система состоит из 1-го EXE файла и нескольких DLL файлов. Пока терминальный вариант. На сколько актуально в Харборе использовать DLL файлы для программы пока не знаю. Решил проверить такую возможность. А насколько большие exe файлы может формировать Харбор без ущерба по скорости работы ПО?

Andrey: Aleksandr_D пишет: возвращает NiLL. Смотри как у меня в исходнике:[pre2] uRet := hb_DynCall( { "MG_square", hDllHandle, HB_DYN_CTYPE_INT }, 64 ) MsgDebug("Calling the C ++ function of MG_square() - Passing values=64, uRet=",uRet) или uRet := hb_DynCall( { "MG_divv", hDllHandle, HB_DYN_CTYPE_DOUBLE }, 10.0, 2.2 ) MsgDebug("Calling the C ++ function of MG_divv() - Passing values=(10.0 / 2.2), uRet=",uRet) [/pre2] HB_DYN_CTYPE_INT / HB_DYN_CTYPE_DOUBLE - тип возвращаемого значения. Aleksandr_D пишет: На сколько актуально в Харборе использовать DLL файлы для программы пока не знаю. Решил проверить такую возможность. Не знаю как делать DLL на Харборе. Сделал один большой ехе-ник и не пожалел. У меня большая терминалка (12 Мб текста исходников) собирается примерно в 6,1 Мб ехе-ник Думаю что ОДИН ехе-ник лучше чем разбивка его на несколько dll. Ехе-ник уже загружен в памяти, а dll-ку нужно подгружать, время на это тратиться конечно немного, но мне не понравилось такая разбивка своей терминалки.

Aleksandr_D: Задача решена. Проблема была в не корректности параметров сборки. Вот описание программ и параметров сборки. && MAIN.PRG – файл программы ********************************************** DYNAMIC FILEMAN1 && Декларация используемых в DLL функций FUNCTION Main() hLib := hb_libLoad( hb_libName( 'E:\TEST_H\NC.DLL' ) ) IF !Empty( hLib ) && варианты вызова DO('FileMan1') FILEMAN1() hb_LibFree( hLib ) ENDIF RETURN && NC.PRG – файл DLL ************************************************** && Декларация используемых в основной программе функций DYNAMIC BOXSHADOW …… DYNAMIC DISPWINDOW FUNCTION FileMan1() …. RETURN RetVal && MAIN.HBP ************************************************** && Сборка для основной программы -hbexe -n -prgflag={win}-DGTWVT -gui -std # paths to the main and extension * .Lib -lhbct -lhbmaindllh -lhbmaindllp -lharbour-32-bcc -lhbdebug MAIN.PRG /b /n /q /dDEBUG /dGTWVT && NC_DLL.HBP ****************************************** && Сборка для DLL -hbdynvm # the name of the module -oNC.DLL # paths to the main and extension * .Lib -lhbct -lhbmainstd -lharbour-32-bcc -lhbmaindllp -lhbmaindllh # список *.prg и *.c NC.prg /b /n /q /dDEBUG PS: спасибо всем.

Aleksandr_D: Andrey пишет: Думаю что ОДИН ехе-ник лучше чем разбивка его на несколько dll. ..... Андрей, спасибо за ответ! Согласен что один Ехе-ник - удобно. В dll-ки я переношу функционал которые редко используется пользователями. Или "архивный" функционал (например отчетные формы которые уже не используются)

PSP: Aleksandr_D пишет: В dll-ки я переношу функционал которые редко используется пользователями. Или "архивный" функционал (например отчетные формы которые уже не используются) Не забывайте про Dll hell

Aleksandr_D: PSP пишет: Не забывайте про Dll hell Что Вы имеете в виду?

PSP: https://ru.wikipedia.org/wiki/DLL_hell

Aleksandr_D: PSP пишет: https://ru.wikipedia.org/wiki/DLL_hell Ясно. Спасибо! Разбивку программ на DLL использую с 2000-го года.

PSP: По мне - лишнее это. Учитывая нынешние размеры ОЗУ и механизмы управления памятью в современных ОС, лучше всё в exe-шнике. Это моё имхо.

Aleksandr_D: PSP пишет: По мне - лишнее это. Учитывая нынешние размеры ОЗУ и механизмы управления памятью в современных ОС, лучше всё в exe-шнике. Это моё имхо. Согласен. Это "старое наследие" от которого нужно будет избавляться.

Pasha: Я использую другой подход. Не в целях экономии памяти, а для облегчения дистрибуции. Скажем, множество сервисных функций выделяю в отдельную dll. И теперь при изменении в ней некоторого функционала я не пересобираю десяток-другой exe, а пересобираю единственную dll Для "облегчения" самих exe использую harbour*.dll, таким образом сами exe не содержат harbour vm и rtl, а только свой функционал.

Aleksandr_D: Pasha пишет: Спасибо за информацию. "Для "облегчения" самих exe использую harbour*.dll, таким образом сами exe не содержат harbour vm и rtl, а только свой функционал." - так и постарался сделать (см. описание выше Пост. 4), хотя скорее всего что то упустил.

SergKis: Aleksandr_D Не забывайте про hrb, полученные из prg. Их можно пихать в ресурсы exe или dll, zip ... Можно хранить prg и hrb получать на лету ... hrb маленькие по размеру.

Aleksandr_D: SergKis пишет: Не забывайте про hrb, полученные из prg. SergKis, спасибо за информацию! Я использую Харбор только 3-ий день. Не подскажите где более подробно об этом можно почитать.

Dima: Aleksandr_D пишет: Не подскажите где более подробно об этом можно почитать. http://www.kresin.ru/hrbfaq_3.html#Doc6

Aleksandr_D: Dima пишет: Дмитрий, спасибо!

SergKis: Aleksandr_D пишет Я использую Харбор только 3-ий день. Не подскажите где более подробно об этом можно почитать. Почитать - это хорошо, а посмотреть на текстах лучше. https://github.com/elchs/LetoDBf => source\server.prg : STATIC PROCEDURE leto_hrbLoad( cData ) PROCEDURE leto_UdfReload( cData )



полная версия страницы