Автор | Сообщение |
|
| |
Пост N: 106
Зарегистрирован: 23.06.08
|
|
Отправлено: 04.08.18 00:00. Заголовок: Как избавиться от harbour.dll в C/C++ библиотеке?
Здравствуйте. Я написал пример на Harbour, который передаёт массив ( PHB_ITEM) во внешнюю DLL. Но для того, чтобы пройтись по его элементам, в моей DLL необходимо импортировать функции наподобии hb_itemNew, hb_arrayLen, hb_arrayGet, hb_itemRelease. Если я подключаю harbour-32.lib, то моя DLL отказывается загружаться без harbour-32.dll который весит больше моего примера на Harbour. Как можно заставить мою DLL подгружать методы из скомпилированного EXE примера вместо harbour-32.dll? Или единственный способ это вручную импортировать все указатели на используемые функции ? Исходники: build.bat - Скрытый текст
цитата: | call "C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\vcvarsall.bat" x86 set HB_ROOT=C:\MiniGUI\HarbourMSVC %HB_ROOT%\bin\win\msvc\hbmk2 demo.prg set INCLUDE=%INCLUDE%;%HB_ROOT%\include set LIB=%LIB%;%HB_ROOT%\lib\win\msvc cl.exe /MT demo_lib.cpp /link /DLL /OUT:demo_lib.dll del *.obj del *.exp pause |
|
| Demo_lib.prg - Скрытый текст
цитата: | #include <windows.h> #include <stdio.h> #include <hbapi.h> #include <hbapiitm.h> #pragma comment(lib,"harbour-32.lib") BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved) { return TRUE; } int ITERATE_ARRAY(PHB_ITEM pArray) { int i, local = 0; int result = 0; PHB_ITEM pItem = hb_itemNew( NULL ); for (i=0;i<=hb_arrayLen(pArray);i++) { if (!hb_arrayGet(pArray, i, pItem)) continue; if (HB_IS_ARRAY(pItem)) result += ITERATE_ARRAY(pItem); if (HB_IS_INTEGER(pItem)) result += hb_itemGetNI(pItem); } hb_itemRelease(pItem); return result; } extern "C" __declspec(dllexport) int ARRAY_SUM(PHB_ITEM pArray) { int result = ITERATE_ARRAY(pArray); return result; } |
|
| Demo.prg - Скрытый текст
цитата: | PROCEDURE Main aData := { NIL, .T., 244.44, 2,4,4,5,5, {10,10, .T.}, {20, 255.55}, {NIL},{{{{{44}}}}} } ? "aData := { NIL, .T., 244.44, 2,4,4,5,5, {10,10, .T.}, {20, 255.55}, {NIL},{{{{{44}}}}} }" ? "SUM: ", ARRAY_SUM(aData) ? PRINT_FUNC_POINTER() INKEY(0) RETURN #pragma BEGINDUMP #include <hbapi.h> #include <hbapierr.h> #include <windows.h> typedef int(*FUNC_ARRAY_SUM)(PHB_ITEM item); typedef HB_SIZE(*FUNC_ARRAY_LEN)(PHB_ITEM item); HB_FUNC(PRINT_FUNC_POINTER) { char buffer[64]; FUNC_ARRAY_LEN test_pointer = &hb_arrayLen; sprintf_s(buffer, 64, "Func address: %p", test_pointer); hb_retc(buffer); } HB_FUNC(ARRAY_SUM) { PHB_ITEM pArray; HINSTANCE hModule; FUNC_ARRAY_SUM func; char buffer[255]; int result = 0; pArray = hb_param( 1, HB_IT_ARRAY ); if(!pArray) { FreeLibrary(hModule); hb_errRT_BASE( EG_ARG, 1111, NULL, HB_ERR_FUNCNAME, HB_ERR_ARGS_BASEPARAMS ); return; } hModule = LoadLibrary("demo_lib.dll"); if (!hModule) { sprintf_s(buffer, 255, "[ERROR %d] Can't load DLL: demo_lib\n", GetLastError()); hb_retc(buffer); return; } func = (FUNC_ARRAY_SUM) GetProcAddress(hModule, "ARRAY_SUM"); if (!func) { FreeLibrary(hModule); sprintf_s(buffer, 255, "[ERROR %d] Can't load function: ARRAY_SUM\n", GetLastError()); hb_retc(buffer); return; } result = func(pArray); FreeLibrary(hModule); hb_retni(result); } #pragma ENDDUMP |
|
|
| |
|
Ответов - 2
[только новые]
|
|
|
| Администратор
|
Пост N: 3787
Зарегистрирован: 23.05.05
|
|
Отправлено: 04.08.18 18:51. Заголовок: Избавиться то можно,..
Избавиться то можно, но результат будет не очень. Тогда надо не импортировать указанные функции, а включить их в состав своей dll. Но эти функции потянут за собой harbour vm, так что в результате размер своей dll сильно вырастет. Конечно, не до размера harbour.dll, но все же существенно. Для этого пример надо собирать не с harbour-32.lib, а с библиотеками hbcommon, hbmacro, hbrtl, hbvm Еще конечно можно самостоятельно собрать вместо harbour-32.dll библиотеку, содержащую harbour vm без функций rtl и других ненужных модулей, но это будет уже посложнее. Размер этой dll тоже будет приличный.
| |
|
|
| постоянный участник
|
Пост N: 1468
Зарегистрирован: 27.01.07
|
|
Отправлено: 04.08.18 21:16. Заголовок: Оффтоп: вот честно -..
Оффтоп: вот честно - не понимаю, какое имеет значение размер файлов в современных условиях. Вы ж не на Win98 это всё запускаете, а?
| |
|
|
|