Форум » GUI » Дайте скрипт для создания своей DLL, pls. » Ответить

Дайте скрипт для создания своей DLL, pls.

SADSTAR2: Дайте скрипт для создания своей DLL, pls. MyDll.prg -> MyDll.dll Применительно к структуре и файлам дистрибутива MiniGUI. Те примеры, которые нашел поиском на форуме, не работают. И связанный вопрос. Как из готового exe-шника обращиться к функциям dll, если имя DLL и имя функции неизвестно на этапе компиляции exe-шника, а имя dll и имя функции становится известным в процессе выполнения exe-шника?

Ответов - 6

Петр: Относительно скрипта для создания DLL "применительно к структуре и файлам дистрибутива MiniGUI" ничего не скажу, не знаю о чем речь. Как из готового exe-шника обращиться к функциям dll, если имя DLL и имя функции неизвестно на этапе компиляции exe-шника, а имя dll и имя функции становится известным в процессе выполнения exe-шника? PROCEDURE main LOCAL result result := ExecuteFuncFromLib( "mydll", "myfunc", 12, "string" ) FUNCTION ExecuteFuncFromLib( cDllName, cFuncName, ... ) LOCAL lib, result := NIL lib = Hb_libLoad( cDllName ) IF ! Hb_IsNil( lib ) result := HB_libDo( cFuncName, ... ) Hb_LibFree( lib ) ENDIF RETURN result Но это не совсем безопасный и не самый быстрый путь, Пржемек предлагает использовать такую схему BTW using: DYNAMIC OtherFuncInPCodeDll and then: OtherFuncInPCodeDll( nParam ) is much faster then HB_LilbDo() which search for function symbol on each call. In Harbour you can also make: sym := &("@OtherFuncInPCodeDll()") and then: sym:exec( nParam ) Еще один совет от Пржемека If you want to create automatically list of functions declared as DYNAMIC you can use in your PCODE DLLs then please add to your main code: proc genFuncList() local aFunc, hFile aFunc := getFuncList() asort( aFunc ) hFile := fcreate("dynamic.ch") aeval( aFunc, {|x| fwrite( hFile, "DYNAMIC " + x + hb_osNewLine() ) } ) fclose( hFile ) return func getFuncList() local aFunc, nCount := __dynsCount(), nDst:=0, n aFunc := array( nCount ) for n := 1 to nCount if __dynsIsFun( n ) aFunc[ ++nDst ] := __dynsGetName( n ) endif next asize( aFunc, nDst ) return aFunc and then simply call genFuncList() it will create dynamic.ch file with all available functions. Then simply add: #include "dynamic.ch" to your .prg code which should be linked into dynamic DLL. And do not create any stub functions.

SADSTAR2: Петр пишет: Относительно скрипта для создания DLL "применительно к структуре и файлам дистрибутива MiniGUI" ничего не скажу, не знаю о чем речь. После установки MiniGUI, например "Harbour MiniGUI 1.4 Extended Edition (Build 42) - 2007.08.29", Создается структура папок C:/MiniGUI/... и соответствующий набор файлов в них. Дело в том, что в найденных мною примерах скриптов для создания DLL, участвуют файлы, которых нет в моих дистрибутивах MiniGUI. Например - harbour.lib А в пакете xMate, в котором есть режим создания dll и настройка окружения "MiniGUI", строка настройки на создание ddl - пустая. И поэтому, наверное, он ругается и ничего не делает.

Pasha: 1-й файл - батник @echo off if not exist obj\dll\mydll md obj\dll\mydll if not exist lib\b32 md lib\b32 :BUILD make -fmydll.bc %1 %2 %3 > dll_b32.log if errorlevel 1 goto BUILD_ERR if "%1" == "clean" goto CLEAN if "%1" == "CLEAN" goto CLEAN :BUILD_OK if exist hdll.tmp del hdll.tmp if exist lib\b32\mydll.dll implib -f lib\b32\mydll.lib lib\b32\mydll.dll > nul if exist lib\b32\mydll.dll copy lib\b32\mydll.dll lib > nul if exist lib\b32\mydll.lib copy lib\b32\mydll.lib lib > nul goto EXIT :BUILD_ERR notepad dll_b32.log goto EXIT :CLEAN if exist dll_b32.log del dll_b32.log :EXIT


Pasha: 2-й файл mydll.bc отправить не удается, форум ругается: Ник должен содержать как минимум итд По-видимому, форум интерпретирует какие-то спецсимволы как свою команду, и не может ее выполнить Дай почту, отправлю

SADSTAR2: sadstar@mail.ru Биг сэнкс

Chesnok: Здравствуйте, скажите у вас получилось создать вот такую штуку MyDll.prg -> MyDll.dll .. Если да не могли бы вы ответить как вы это делаете?



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