Автор |
Сообщение |
|
|
Заголовок сообщения: |
|
|
|
ygrek писал(а): Можно экспортировать столько функций сколько надо - будет обычная dll'ка с нужными экспортами. Но это не очень удобно делать - надо править код exedll.f и указывать список функций руками в нескольких местах. Может получится это автоматизировать.. .........
Хорошая мысля, а то править 2-а исходника
Ну а дальше возможность компилить для kernel-mode!
[quote="ygrek"]Можно экспортировать столько функций сколько надо - будет обычная dll'ка с нужными экспортами. Но это не очень удобно делать - надо править код exedll.f и указывать список функций руками в нескольких местах. Может получится это автоматизировать.. ......... [/quote]
Хорошая мысля, а то править 2-а исходника :(
Ну а дальше возможность компилить для kernel-mode! ;)
|
|
|
|
Добавлено: Сб сен 19, 2009 12:00 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Можно экспортировать столько функций сколько надо - будет обычная dll'ка с нужными экспортами. Но это не очень удобно делать - надо править код exedll.f и указывать список функций руками в нескольких местах. Может получится это автоматизировать..
С другой стороны xt это указатель на код. Его можно вызывать из си, но скорее всего понадобится ассемблерная вставка т.к. один параметр (вершину стека) надо передавать в eax - это не попадает под стандартные сишные форматы вызова, вдобавок несколько возвращаемых значений тоже надо снимать со стека. Один раз придётся покопаться разобраться, но в качестве бонуса - больше гибкости - доступна вся форт-система. Вопрос стоит ли овчинка выделки остаётся открытым.
Мне хватило первого способа.
Можно экспортировать столько функций сколько надо - будет обычная dll'ка с нужными экспортами. Но это не очень удобно делать - надо править код exedll.f и указывать список функций руками в нескольких местах. Может получится это автоматизировать..
С другой стороны xt это указатель на код. Его можно вызывать из си, но скорее всего понадобится ассемблерная вставка т.к. один параметр (вершину стека) надо передавать в eax - это не попадает под стандартные сишные форматы вызова, вдобавок несколько возвращаемых значений тоже надо снимать со стека. Один раз придётся покопаться разобраться, но в качестве бонуса - больше гибкости - доступна вся форт-система. Вопрос стоит ли овчинка выделки остаётся открытым.
Мне хватило первого способа.
|
|
|
|
Добавлено: Сб сен 19, 2009 00:02 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Вопрос по использованию слов из полученого dll-файла например на С. Насколько я понял, для экспорта используется слово sfind, которое возвращает xt. А в программе на С, что с этим xt делать? Использовать как указатель на функцию? А просто по имени слова уже не вызвать? Пример вызова слова из dll-файла у Pinka приведен для SPF. Код: spf4.exe WINAPI: sfind mydll.dll VECT eval S" EVALUATE" sfind TO eval S" 2 3 + ." eval А как это же сделать на С, Pascal и др.? Мне хватит примера на С.
Вопрос по использованию слов из полученого dll-файла например на С. Насколько я понял, для экспорта используется слово sfind, которое возвращает xt. А в программе на С, что с этим xt делать? Использовать как указатель на функцию? А просто по имени слова уже не вызвать? Пример вызова слова из dll-файла у Pinka приведен для SPF. [code]spf4.exe WINAPI: sfind mydll.dll VECT eval S" EVALUATE" sfind TO eval S" 2 3 + ." eval[/code] А как это же сделать на С, Pascal и др.? Мне хватит примера на С.
|
|
|
|
Добавлено: Ср сен 16, 2009 11:56 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Зачем тут код exe2dll.test.f - это ничего не объясняет.
Вот коммит с иправлением.
Цитата: Исправление ошибки: из-за пропуска ERASE-IMPORTS созданная dll не работала при смене адресов расположения системных dll. Callback DllMain надо создавать по особому, чтобы вовремя сработал PROCESS-INIT и ERASE-IMPORTS
AlikasS, спасибо за корректный багрепорт (с кодом и нерабочим примером) -- все бы так делали..
Зачем тут код exe2dll.test.f - это ничего не объясняет.
Вот [url=http://spf.cvs.sourceforge.net/viewvc/spf/devel/~pinka/lib/tools/exe2dll.test.f?r1=1.2&r2=1.3]коммит[/url] с иправлением.
[quote] Исправление ошибки: из-за пропуска ERASE-IMPORTS созданная dll не работала при смене адресов расположения системных dll. Callback DllMain надо создавать по особому, чтобы вовремя сработал PROCESS-INIT и ERASE-IMPORTS [/quote]
[b]AlikasS[/b], спасибо за корректный багрепорт (с кодом и нерабочим примером) -- все бы так делали..
|
|
|
|
Добавлено: Пт авг 14, 2009 22:56 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
автор обновил файл-пример в репозитарии SPF
т.е. USER-INIT править не надо
exe2dll.test.f стал сейчас такой
Код: \ OPT? \ DIS-OPT
FALSE TO OPT?
REQUIRE { ~ac\lib\locals.f
: (INIT1) \ part1. -- see /spf/src/spf_init.f#(INIT) 0 TO H-STDLOG 0 TO H-STDIN CONSOLE-HANDLES ['] CGI-OPTIONS ERR-EXIT MAINX @ ?DUP IF ERR-EXIT THEN \ (?) ;
: (INIT2) \ part2. (not used here) SPF-INIT? IF ['] SPF-INI ERR-EXIT THEN OPTIONS CGI? @ 0= POST? @ OR IF ['] <MAIN> ERR-EXIT THEN BYE ;
: (dllinit) ( reserved reason hinstance -- retcode ) OVER 0 = IF ." DLL_PROCESS_DETACH " ELSE OVER 1 = IF (INIT1) ." DLL_PROCESS_ATTACH " ELSE OVER 2 = IF ." DLL_THREAD_ATTACH " ELSE OVER 3 = IF ." DLL_THREAD_DETACH " ELSE OVER . THEN THEN THEN THEN CR 2DROP DROP 1 \ 0 to fail ;
VARIABLE _CNT
: PROCESS-INIT-ONCE ( n -- ) _CNT @ 0= IF PROCESS-INIT ELSE DROP THEN _CNT 1+! ;
ALIGN HERE \ see spf_win_defwords.f#EXTERN and tc_spf.F#PROCESSPROC: 3 CELLS LIT, ' PROCESS-INIT-ONCE COMPILE, ' (dllinit) COMPILE, RET, ( xt ) HEADER DllMain ' _WNDPROC-CODE COMPILE, , \ see n_defwords.f#CALLBACK:
: _sfind ( a u -- 0|xt ) SFIND 0= IF 2DROP 0 THEN ; \ ' _sfind WNDPROC: sfind ' _sfind 2 CELLS CALLBACK: sfind
автор обновил файл-пример в репозитарии SPF
т.е. USER-INIT править не надо
exe2dll.test.f стал сейчас такой
[code]\ OPT? \ DIS-OPT
FALSE TO OPT?
REQUIRE { ~ac\lib\locals.f
: (INIT1) \ part1. -- see /spf/src/spf_init.f#(INIT) 0 TO H-STDLOG 0 TO H-STDIN CONSOLE-HANDLES ['] CGI-OPTIONS ERR-EXIT MAINX @ ?DUP IF ERR-EXIT THEN \ (?) ;
: (INIT2) \ part2. (not used here) SPF-INIT? IF ['] SPF-INI ERR-EXIT THEN OPTIONS CGI? @ 0= POST? @ OR IF ['] <MAIN> ERR-EXIT THEN BYE ;
: (dllinit) ( reserved reason hinstance -- retcode ) OVER 0 = IF ." DLL_PROCESS_DETACH " ELSE OVER 1 = IF (INIT1) ." DLL_PROCESS_ATTACH " ELSE OVER 2 = IF ." DLL_THREAD_ATTACH " ELSE OVER 3 = IF ." DLL_THREAD_DETACH " ELSE OVER . THEN THEN THEN THEN CR 2DROP DROP 1 \ 0 to fail ;
VARIABLE _CNT
: PROCESS-INIT-ONCE ( n -- ) _CNT @ 0= IF PROCESS-INIT ELSE DROP THEN _CNT 1+! ;
ALIGN HERE \ see spf_win_defwords.f#EXTERN and tc_spf.F#PROCESSPROC: 3 CELLS LIT, ' PROCESS-INIT-ONCE COMPILE, ' (dllinit) COMPILE, RET, ( xt ) HEADER DllMain ' _WNDPROC-CODE COMPILE, , \ see n_defwords.f#CALLBACK:
: _sfind ( a u -- 0|xt ) SFIND 0= IF 2DROP 0 THEN ; \ ' _sfind WNDPROC: sfind ' _sfind 2 CELLS CALLBACK: sfind[/code]
|
|
|
|
Добавлено: Пт авг 14, 2009 17:16 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
для тех кому интересно.
баг вроде решен.
как временное решение
добавить
Код: : USER-INIT ( n -- ) ERASE-IMPORTS ..... ....
в \src\win\spf_win_init.f
автор, (~pinka)
после проверки корректности решения, обещал обновить либу
для тех кому интересно.
баг вроде решен.
как временное решение
добавить
[code]: USER-INIT ( n -- ) ERASE-IMPORTS ..... ....[/code]
в \src\win\spf_win_init.f
автор, (~pinka)
после проверки корректности решения, обещал обновить либу
|
|
|
|
Добавлено: Чт авг 13, 2009 18:58 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
Проверил, не работают: Код: H:\...созданные DLL\4.SMALLEST-SPF\SP3>F:\SPF\spf4.exe <TEST.F SP-FORTH - ANS FORTH 94 for Win95/98/Me/NT/2k/XP/Vista Open source project at http://spf.sf.net Russian FIG at http://www.forth.org.ru ; Started by A.Cherezov Version 4.19 Build 001 at 27.Aug.2008
WINAPI: sexecl sexecl.dll ^ -2009 Library not found HERE HERE S" S" ping 127.0.01 sexecl ASCIIZ> TYPE ^ Forth: Can't load a library sexecl.dll SP2 - работают: Код: H:\...зданные DLL\1.оптимизатор ON\SP2>F:\SPF\spf4.exe <TEST.F SP-FORTH - ANS FORTH 94 for Win95/98/Me/NT/2k/XP/Vista Open source project at http://spf.sf.net Russian FIG at http://www.forth.org.ru ; Started by A.Cherezov Version 4.19 Build 001 at 27.Aug.2008
SP-FORTH - ANS FORTH 94 for Win95/98/Me/NT/2k/XP/Vista Open source project at http://spf.sf.net Russian FIG at http://www.forth.org.ru ; Started by A.Cherezov Version 4.20 Build 002 at 09.Aug.2009
DLL_PROCESS_ATTACH Ok
Обмен пакетами с 127.0.0.1 по 32 байт:
Ответ от 127.0.0.1: число байт=32 время<1мс TTL=128 Ответ от 127.0.0.1: число байт=32 время<1мс TTL=128 Ответ от 127.0.0.1: число байт=32 время<1мс TTL=128 Ответ от 127.0.0.1: число байт=32 время<1мс TTL=128
Статистика Ping для 127.0.0.1: Пакетов: отправлено = 4, получено = 4, потеряно = 0 (0% потерь), Приблизительное время приема-передачи в мс: Минимальное = 0мсек, Максимальное = 0 мсек, Среднее = 0 мсек Ok DLL_PROCESS_DETACH Использовал файл TEST.F: Код: WINAPI: sexecl sexecl.dll HERE HERE S" " S" ping 127.0.01" sexecl ASCIIZ> TYPE
Проверил, не работают:[code]H:\...созданные DLL\4.SMALLEST-SPF\SP3>F:\SPF\spf4.exe <TEST.F SP-FORTH - ANS FORTH 94 for Win95/98/Me/NT/2k/XP/Vista Open source project at http://spf.sf.net Russian FIG at http://www.forth.org.ru ; Started by A.Cherezov Version 4.19 Build 001 at 27.Aug.2008
WINAPI: sexecl sexecl.dll ^ -2009 Library not found HERE HERE S" S" ping 127.0.01 sexecl ASCIIZ> TYPE ^ Forth: Can't load a library sexecl.dll[/code]SP2 - работают:[code]H:\...зданные DLL\1.оптимизатор ON\SP2>F:\SPF\spf4.exe <TEST.F SP-FORTH - ANS FORTH 94 for Win95/98/Me/NT/2k/XP/Vista Open source project at http://spf.sf.net Russian FIG at http://www.forth.org.ru ; Started by A.Cherezov Version 4.19 Build 001 at 27.Aug.2008
SP-FORTH - ANS FORTH 94 for Win95/98/Me/NT/2k/XP/Vista Open source project at http://spf.sf.net Russian FIG at http://www.forth.org.ru ; Started by A.Cherezov Version 4.20 Build 002 at 09.Aug.2009
DLL_PROCESS_ATTACH Ok
Обмен пакетами с 127.0.0.1 по 32 байт:
Ответ от 127.0.0.1: число байт=32 время<1мс TTL=128 Ответ от 127.0.0.1: число байт=32 время<1мс TTL=128 Ответ от 127.0.0.1: число байт=32 время<1мс TTL=128 Ответ от 127.0.0.1: число байт=32 время<1мс TTL=128
Статистика Ping для 127.0.0.1: Пакетов: отправлено = 4, получено = 4, потеряно = 0 (0% потерь), Приблизительное время приема-передачи в мс: Минимальное = 0мсек, Максимальное = 0 мсек, Среднее = 0 мсек Ok DLL_PROCESS_DETACH[/code] Использовал файл TEST.F:[code]WINAPI: sexecl sexecl.dll HERE HERE S" " S" ping 127.0.01" sexecl ASCIIZ> TYPE [/code]
|
|
|
|
Добавлено: Пн авг 10, 2009 11:54 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
ygrek писал(а): AlikasS писал(а): Цитата:-2009 Library not found Это сообщение намекает что не удалось найти какую-то dll. Надо выяснить какую. Поиск dll происходит при первом объявлении функции из ней с помощью WINAPI:. Запусти голый spf и проверь что S" sexecl.dll" DROP LoadLibrary даёт нормальный хэндл. Если так - запусти тестовый пример под dependency walker'ом и посмотри какую либу оно не нашло. Или можно проще пересобрать spf с распечаткой подгружаемых dll. не получается, dll собранная в другом сервиспаке не подключается
Код: S" sexecl.dll" DROP LoadLibraryA Ok ( 0 )
файлики выложил здесь
SPF.zip (280.28KB)
[quote="ygrek"][quote="AlikasS"]Цитата:-2009 Library not found[/quote] Это сообщение намекает что не удалось найти какую-то dll. Надо выяснить какую. Поиск dll происходит при первом объявлении функции из ней с помощью WINAPI:. Запусти голый spf и проверь что S" sexecl.dll" DROP LoadLibrary даёт нормальный хэндл. Если так - запусти тестовый пример под dependency walker'ом и посмотри какую либу оно не нашло. Или можно проще пересобрать spf с распечаткой подгружаемых dll.[/quote]не получается, dll собранная в другом сервиспаке не подключается
[code]S" sexecl.dll" DROP LoadLibraryA Ok ( 0 )[/code]
файлики выложил здесь
[url=http://slil.ru/27890167]SPF.zip[/url] (280.28KB)
|
|
|
|
Добавлено: Пн авг 10, 2009 04:27 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
AlikasS писал(а): Цитата:-2009 Library not found
Это сообщение намекает что не удалось найти какую-то dll. Надо выяснить какую. Поиск dll происходит при первом объявлении функции из ней с помощью WINAPI:. Запусти голый spf и проверь что S" sexecl.dll" DROP LoadLibrary даёт нормальный хэндл. Если так - запусти тестовый пример под dependency walker'ом и посмотри какую либу оно не нашло. Или можно проще пересобрать spf с распечаткой подгружаемых dll.
[quote="AlikasS"]Цитата:-2009 Library not found[/quote]
Это сообщение намекает что не удалось найти какую-то dll. Надо выяснить какую. Поиск dll происходит при первом объявлении функции из ней с помощью WINAPI:. Запусти голый spf и проверь что S" sexecl.dll" DROP LoadLibrary даёт нормальный хэндл. Если так - запусти тестовый пример под dependency walker'ом и посмотри какую либу оно не нашло. Или можно проще пересобрать spf с распечаткой подгружаемых dll.
|
|
|
|
Добавлено: Вс авг 09, 2009 11:41 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
У меня есть доступ к XPSP2. Сделай примерчик, чтоб скачать и проверить - запущу.
У меня есть доступ к XPSP2. Сделай примерчик, чтоб скачать и проверить - запущу.
|
|
|
|
Добавлено: Вс авг 09, 2009 01:35 |
|
|
|
|
|
Заголовок сообщения: |
|
|
|
кто-нибудь подтвердит или наоборот?
может у меня в компах что-то не то и надо искать?
или нужна дополнительная информация?
кто-нибудь подтвердит или наоборот?
может у меня в компах что-то не то и надо искать?
или нужна дополнительная информация?
|
|
|
|
Добавлено: Сб авг 08, 2009 18:37 |
|
|
|
|
|
Заголовок сообщения: |
сборка DLL в XP SP2 и SP3 |
|
|
DLL собранная в SPF в XP SP3 не подключается в XP SP2. баг?
Цитата: -2009 Library not found собираю с помощью devel\~pinka\lib\tools\make-dll.cmd отличия от файлов-примеров нужных для сборки exe2dlll.f: Код: HERE >rva 0 W, \ NameOrdinals HERE 1+ >rva S" sexecl" S", 0 C, \ names itself HERE >rva SWAP , \ array of rva names HERE >rva ['] sexecl >RVA , \ array of rva functions HERE 1+ >rva dllname-a @ dllname-u @ S", 0 C, \ dll name exe2dll.test.f: Код: REQUIRE { lib\ext\locals.f devel\~ac\lib\win\process\exec.f \ ... \ ... \ ... \ ... \ ... ' (dllinit) 3 CELLS CALLBACK: DllMain
\ ' ANSI>OEM TO ANSI><OEM
: _sexecl ( adr ina inu cmda cmdu -- ) { z ina inu cmda cmdu -- } ina inu cmda cmdu SEXECL 2DROP z SWAP CMOVE ; ' _sexecl 5 CELLS CALLBACK: sexecl после нормального подключения для теста можно сделать Цитата: WINAPI: sexecl sexecl.dll HERE DUP S" " S" ping 127.0.0.1" sexecl ASCIIZ> TYPE
[b]DLL собранная в SPF в XP SP3 не подключается в XP SP2. баг?[/b]
[quote]-2009 Library not found[/quote] собираю с помощью devel\~pinka\lib\tools\make-dll.cmd отличия от файлов-примеров нужных для сборки exe2dlll.f: [code] HERE >rva 0 W, \ NameOrdinals HERE 1+ >rva S" sexecl" S", 0 C, \ names itself HERE >rva SWAP , \ array of rva names HERE >rva ['] sexecl >RVA , \ array of rva functions HERE 1+ >rva dllname-a @ dllname-u @ S", 0 C, \ dll name[/code]
exe2dll.test.f: [code]REQUIRE { lib\ext\locals.f devel\~ac\lib\win\process\exec.f \ ... \ ... \ ... \ ... \ ... ' (dllinit) 3 CELLS CALLBACK: DllMain
\ ' ANSI>OEM TO ANSI><OEM
: _sexecl ( adr ina inu cmda cmdu -- ) { z ina inu cmda cmdu -- } ina inu cmda cmdu SEXECL 2DROP z SWAP CMOVE ; ' _sexecl 5 CELLS CALLBACK: sexecl[/code] после нормального подключения для теста можно сделать [quote]WINAPI: sexecl sexecl.dll HERE DUP S" " S" ping 127.0.0.1" sexecl ASCIIZ> TYPE[/quote]
|
|
|
|
Добавлено: Вт авг 04, 2009 12:50 |
|
|
|
|