Форум » [x]Harbour » Как избавиться от harbour.dll в C/C++ библиотеке? » Ответить

Как избавиться от harbour.dll в C/C++ библиотеке?

SkyNET: Здравствуйте. Я написал пример на 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 - [more][quote] 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 [/more][/quote] Demo_lib.prg - [more][quote] #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; } [/quote][/more] Demo.prg - [more][quote] 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 [/quote][/more]

Ответов - 2

Pasha: Избавиться то можно, но результат будет не очень. Тогда надо не импортировать указанные функции, а включить их в состав своей dll. Но эти функции потянут за собой harbour vm, так что в результате размер своей dll сильно вырастет. Конечно, не до размера harbour.dll, но все же существенно. Для этого пример надо собирать не с harbour-32.lib, а с библиотеками hbcommon, hbmacro, hbrtl, hbvm Еще конечно можно самостоятельно собрать вместо harbour-32.dll библиотеку, содержащую harbour vm без функций rtl и других ненужных модулей, но это будет уже посложнее. Размер этой dll тоже будет приличный.

PSP: Оффтоп: вот честно - не понимаю, какое имеет значение размер файлов в современных условиях. Вы ж не на Win98 это всё запускаете, а?



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