Forth и другие саморасширяющиеся системы программирования Locations of visitors to this page
Текущее время: Чт мар 28, 2024 22:40

...
Google Search
Forth-FAQ Spy Grafic

Часовой пояс: UTC + 3 часа [ Летнее время ]




Начать новую тему Ответить на тему  [ Сообщений: 12 ] 
Автор Сообщение
 Заголовок сообщения: сборка DLL в XP SP2 и SP3
СообщениеДобавлено: Вт авг 04, 2009 12:50 
Не в сети

Зарегистрирован: Ср дек 06, 2006 12:42
Сообщения: 49
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб авг 08, 2009 18:37 
Не в сети

Зарегистрирован: Ср дек 06, 2006 12:42
Сообщения: 49
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
кто-нибудь подтвердит или наоборот?
может у меня в компах что-то не то и надо искать?
или нужна дополнительная информация?


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс авг 09, 2009 01:35 
Не в сети

Зарегистрирован: Сб май 06, 2006 12:01
Сообщения: 959
Откуда: Украина, Харьков
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
У меня есть доступ к XPSP2. Сделай примерчик, чтоб скачать и проверить - запущу.

_________________
With best wishes, in4.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Вс авг 09, 2009 11:41 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
AlikasS писал(а):
Цитата:-2009 Library not found

Это сообщение намекает что не удалось найти какую-то dll. Надо выяснить какую. Поиск dll происходит при первом объявлении функции из ней с помощью WINAPI:. Запусти голый spf и проверь что S" sexecl.dll" DROP LoadLibrary даёт нормальный хэндл. Если так - запусти тестовый пример под dependency walker'ом и посмотри какую либу оно не нашло. Или можно проще пересобрать spf с распечаткой подгружаемых dll.

_________________
http://forth.org.ru/~ygrek


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн авг 10, 2009 04:27 
Не в сети

Зарегистрирован: Ср дек 06, 2006 12:42
Сообщения: 49
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
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)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пн авг 10, 2009 11:54 
Не в сети

Зарегистрирован: Сб май 06, 2006 12:01
Сообщения: 959
Откуда: Украина, Харьков
Благодарил (а): 2 раз.
Поблагодарили: 7 раз.
Проверил, не работают:
Код:
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

_________________
With best wishes, in4.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Чт авг 13, 2009 18:58 
Не в сети

Зарегистрирован: Ср дек 06, 2006 12:42
Сообщения: 49
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
для тех кому интересно.
баг вроде решен.
как временное решение
добавить
Код:
: USER-INIT ( n -- )
ERASE-IMPORTS
.....
....

в \src\win\spf_win_init.f
автор, (~pinka)
после проверки корректности решения, обещал обновить либу


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт авг 14, 2009 17:16 
Не в сети

Зарегистрирован: Ср дек 06, 2006 12:42
Сообщения: 49
Благодарил (а): 0 раз.
Поблагодарили: 0 раз.
автор обновил файл-пример в репозитарии 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


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Пт авг 14, 2009 22:56 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Зачем тут код exe2dll.test.f - это ничего не объясняет.
Вот коммит с иправлением.
Цитата:
Исправление ошибки: из-за пропуска ERASE-IMPORTS созданная dll не работала при смене адресов расположения системных dll.
Callback DllMain надо создавать по особому, чтобы вовремя сработал PROCESS-INIT и ERASE-IMPORTS


AlikasS, спасибо за корректный багрепорт (с кодом и нерабочим примером) -- все бы так делали..

_________________
http://forth.org.ru/~ygrek


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Ср сен 16, 2009 11:56 
Не в сети
Аватара пользователя

Зарегистрирован: Вт фев 17, 2009 19:58
Сообщения: 112
Откуда: Барнаул
Благодарил (а): 21 раз.
Поблагодарили: 16 раз.
Вопрос по использованию слов из полученого 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 и др.? Мне хватит примера на С.


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб сен 19, 2009 00:02 
Не в сети

Зарегистрирован: Чт май 04, 2006 18:18
Сообщения: 456
Благодарил (а): 0 раз.
Поблагодарили: 1 раз.
Можно экспортировать столько функций сколько надо - будет обычная dll'ка с нужными экспортами. Но это не очень удобно делать - надо править код exedll.f и указывать список функций руками в нескольких местах. Может получится это автоматизировать..

С другой стороны xt это указатель на код. Его можно вызывать из си, но скорее всего понадобится ассемблерная вставка т.к. один параметр (вершину стека) надо передавать в eax - это не попадает под стандартные сишные форматы вызова, вдобавок несколько возвращаемых значений тоже надо снимать со стека. Один раз придётся покопаться разобраться, но в качестве бонуса - больше гибкости - доступна вся форт-система. Вопрос стоит ли овчинка выделки остаётся открытым.

Мне хватило первого способа.

_________________
http://forth.org.ru/~ygrek


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
 Заголовок сообщения:
СообщениеДобавлено: Сб сен 19, 2009 12:00 
Не в сети

Зарегистрирован: Чт ноя 23, 2006 00:44
Сообщения: 494
Откуда: СПб
Благодарил (а): 19 раз.
Поблагодарили: 8 раз.
ygrek писал(а):
Можно экспортировать столько функций сколько надо - будет обычная dll'ка с нужными экспортами. Но это не очень удобно делать - надо править код exedll.f и указывать список функций руками в нескольких местах. Может получится это автоматизировать..
.........

Хорошая мысля, а то править 2-а исходника :(
Ну а дальше возможность компилить для kernel-mode! ;)


Вернуться к началу
 Профиль Отправить личное сообщение  
Ответить с цитатой  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 12 ] 

Часовой пояс: UTC + 3 часа [ Летнее время ]


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 13


Вы не можете начинать темы
Вы можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

cron
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
phpBB сборка от FladeX // Русская поддержка phpBB