On-line: гостей 0. Всего: 0 [подробнее..]
АвторСообщение





Не зарегистрирован
Зарегистрирован: 05.02.19
ссылка на сообщение  Отправлено: 05.02.19 18:46. Заголовок: Использование динамических DLL в консольных приложениях


Использование динамических 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

Спасибо: 0 
ПрофильЦитата Ответить
Новых ответов нет , стр: 1 2 All [см. все]


постоянный участник


Пост N: 1579
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 05.02.19 21:43. Заголовок: Судя по всему, идет ..


Судя по всему, идет речь о pcode dll в [x]Harbour

Ошиблись разделом. И вообще..

Если не изменяет память, должно быть как-то так

 цитата:
 
DYNAMIC FILEMAN1

PROCEDURE Main()
LOCAL l := hb_libLoad( hb_libName( "nc" ) )

IF !Empty( l )
FILEMAN1()
hb_LibFree( hLib )
ENDIF

RETURN




Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 1
Зарегистрирован: 05.02.19
ссылка на сообщение  Отправлено: 06.02.19 10:44. Заголовок: Не получилось. Опять..


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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6173
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 06.02.19 11:23. Заголовок: Вот делал пример для..


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

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 3
Зарегистрирован: 05.02.19
ссылка на сообщение  Отправлено: 06.02.19 13:46. Заголовок: Андрей, спасибо! Вы..


Андрей, спасибо!

Вызовы из системных 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 файлы может формировать Харбор без ущерба по скорости работы ПО?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник




Пост N: 6174
Зарегистрирован: 12.09.06
ссылка на сообщение  Отправлено: 06.02.19 14:59. Заголовок: Aleksandr_D пишет: ..


Aleksandr_D пишет:

 цитата:
возвращает NiLL.


Смотри как у меня в исходнике:
 
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)

HB_DYN_CTYPE_INT / HB_DYN_CTYPE_DOUBLE - тип возвращаемого значения.

Aleksandr_D пишет:

 цитата:
На сколько актуально в Харборе использовать DLL файлы для программы пока не знаю. Решил проверить такую возможность.


Не знаю как делать DLL на Харборе.
Сделал один большой ехе-ник и не пожалел.
У меня большая терминалка (12 Мб текста исходников) собирается примерно в 6,1 Мб ехе-ник
Думаю что ОДИН ехе-ник лучше чем разбивка его на несколько dll.
Ехе-ник уже загружен в памяти, а dll-ку нужно подгружать, время на это тратиться конечно немного, но мне не понравилось такая разбивка своей терминалки.

Спасибо: 1 
ПрофильЦитата Ответить





Пост N: 4
Зарегистрирован: 05.02.19
ссылка на сообщение  Отправлено: 06.02.19 15:09. Заголовок: Задача решена. Пробл..


Задача решена. Проблема была в не корректности параметров сборки.
Вот описание программ и параметров сборки.


&& 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: спасибо всем.

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 7
Зарегистрирован: 05.02.19
ссылка на сообщение  Отправлено: 06.02.19 15:26. Заголовок: Andrey пишет: Дума..


Andrey пишет:

 цитата:

Думаю что ОДИН ехе-ник лучше чем разбивка его на несколько dll. .....



Андрей, спасибо за ответ!

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

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1500
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 06.02.19 15:28. Заголовок: Aleksandr_D пишет: ..


Aleksandr_D пишет:

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


Не забывайте про Dll hell

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 8
Зарегистрирован: 05.02.19
ссылка на сообщение  Отправлено: 06.02.19 15:34. Заголовок: PSP пишет: Не забыв..


PSP пишет:

 цитата:
Не забывайте про Dll hell


Что Вы имеете в виду?

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1501
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 06.02.19 15:49. Заголовок: https://ru.wikipedia..

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 9
Зарегистрирован: 05.02.19
ссылка на сообщение  Отправлено: 06.02.19 15:58. Заголовок: PSP пишет: https://..


PSP пишет:

 цитата:
https://ru.wikipedia.org/wiki/DLL_hell



Ясно. Спасибо!
Разбивку программ на DLL использую с 2000-го года.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 1502
Зарегистрирован: 27.01.07
ссылка на сообщение  Отправлено: 06.02.19 16:10. Заголовок: По мне - лишнее это...


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

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 10
Зарегистрирован: 05.02.19
ссылка на сообщение  Отправлено: 06.02.19 16:15. Заголовок: PSP пишет: По мне -..


PSP пишет:

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



Согласен. Это "старое наследие" от которого нужно будет избавляться.

Спасибо: 0 
ПрофильЦитата Ответить
Администратор




Пост N: 3826
Зарегистрирован: 23.05.05
ссылка на сообщение  Отправлено: 06.02.19 16:33. Заголовок: Я использую другой п..


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

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 11
Зарегистрирован: 05.02.19
ссылка на сообщение  Отправлено: 06.02.19 17:02. Заголовок: Я использую другой подход....


Pasha пишет:
[quote]`

Спасибо за информацию.

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

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 2200
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 06.02.19 20:38. Заголовок: Aleksandr_D Не забы..


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

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 12
Зарегистрирован: 05.02.19
ссылка на сообщение  Отправлено: 07.02.19 12:09. Заголовок: Не забывайте про hrb, полученные из prg. ....


SergKis пишет:

 цитата:
Не забывайте про hrb, полученные из prg.



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

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 7015
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 07.02.19 12:17. Заголовок: Aleksandr_D пишет: ..


Aleksandr_D пишет:

 цитата:
Не подскажите где более подробно об этом можно почитать.


http://www.kresin.ru/hrbfaq_3.html#Doc6

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 13
Зарегистрирован: 05.02.19
ссылка на сообщение  Отправлено: 07.02.19 13:54. Заголовок: Dima пишет: Дмитр..


Dima пишет:
[quote]`
Дмитрий, спасибо!

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 2201
Зарегистрирован: 17.02.12
ссылка на сообщение  Отправлено: 07.02.19 19:56. Заголовок: Aleksandr_D пишет Я ..


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


Почитать - это хорошо, а посмотреть на текстах лучше.
https://github.com/elchs/LetoDBf => source\server.prg :
STATIC PROCEDURE leto_hrbLoad( cData )
PROCEDURE leto_UdfReload( cData )

Спасибо: 0 
ПрофильЦитата Ответить
Новых ответов нет , стр: 1 2 All [см. все]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 398
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет