|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Сен 20, 2004 02:08:24 · Поправил: krid24 Есть DLL'ка и imported .LIB для нее. DLL'ка экспортирует функцию по ordinal'у (без имени). Вопрос: как импортировать такую функцию в свою asm прогу? (т.е, что надо прописать в .asm и/или .def ? Или как-то по-другому?). Спасибо. |
|
|
Дата: Сен 20, 2004 05:41:39 Юзай fasm и будет тебе счастье :-) |
|
|
Дата: Сен 20, 2004 05:50:28 krid24 GetProcAddress? |
|
|
Дата: Сен 20, 2004 05:59:35 q_q Я думаю имелось ввиду импортирование через таблицу импорта... |
|
|
Дата: Сен 20, 2004 06:28:07 krid24 DLL'ка экспортирует функцию по ordinal'у (без имени). Зато это имя может быть прописано в *.LIB. Посмотрите символы внутри этой LIB с помощью соответствующих утилит. .DEF - это для экспорта, а не для импорта. |
|
|
Дата: Сен 20, 2004 07:01:52 · Поправил: krid24 Вот конкретный пример: есть в SHELL32.DLL функция, которая показывает диалог выбора иконки (как в свойствах ярлыка -> изменить значок). В SHELL32 эта ф-ция экспортируется не по имени, а по ординалу 62 (если кому интересно, вот прототип (имя произвольное): BOOL WINAPI PickIconDlg(
HWND hwndOwner,
LPSTR lpstrFile,
DWORD nMaxFile,
LPDWORD lpdwIconIndex);
).
Как мне в своей asm (masm,tasm) проге ее заюзать? 2q_q: Как правильно заметил _DEN_ - нужно "неявное" импортирование, без LoadLibrary/GetProcAddress. Чтобы это в таблице импорта было прописано. 2Quantum: А что, такое действительно может быть: в .DLL - ординал, а в .LIB - еще и имя, на которое можно ссылаться в asm коде? И еще: в .DEF можно включать раздел IMPORTS. Он для чего? Просветите, плз. Короче, как ипортировать такие "ординальные" функции в C, Delphi, etc, - я знаю, а как в asm (masm,tasm) - нет. Поможите, люди добрые. |
|
|
Дата: Сен 20, 2004 08:13:24 krid24 А что, такое действительно может быть: в .DLL - ординал, а в .LIB - еще и имя, на которое можно ссылаться в asm коде? Угу. И еще: в .DEF можно включать раздел IMPORTS. Он для чего? Если мне память не изменяет, то в MSDN про это что-то мутное написано... Короче, этот раздел ничего полезного не делает. Как мне в своей asm (masm,tasm) проге ее заюзать? Первым делом нужно определить символ _PickIconDlg@16 в либе, т.е. сгенерировать свой shell32.lib. Можно так: ; shell32.asm:
.386
.model flat,stdcall
option casemap:none
include \masm32\include\windows.inc
include \masm32\include\kernel32.inc
includelib \masm32\lib\kernel32.lib
.CODE
DllEntry PROC hInstance:DWORD,reason:DWORD,resvd:DWORD
mov eax,1
ret
DllEntry ENDP
PickIconDialog PROC p1:DWORD,p2:DWORD,p3:DWORD,p4:DWORD
ret
PickIconDialog ENDP
END DllEntry
;shell32.def:
LIBRARY SHELL32
EXPORTS PickIconDialog @62
Компилим и получаем shell32.lib с символом _PickIconDialog@16 и ординалом 62. В данную либу желательно добавить остальные символы из стандартного масмовского shell32.lib. Итак, тестовая прога: .386 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc includelib kernel32.lib includelib \path\shell32.lib ; <- это новый shell32.lib ; Прототип externdef _imp__PickIconDialog@16:PTR pr4 PickIconDialog equ <_imp__PickIconDialog@16> .DATA shell32 db "shell32.dll" shell32_len equ $ - shell32 index dd 0 .CODE start: invoke PickIconDialog,0,OFFSET shell32,shell32_len,OFFSET index invoke ExitProcess,0 END start Компилим и... всё OK! |
|
|
Дата: Сен 20, 2004 19:44:42 Quantum > Если мне память не изменяет, то в MSDN про это что-то мутное написано... Короче, этот раздел ничего полезного не делает. В Ида SDK в папке bin\w32 лежит файл IDA.IMP, в нем написано LIBRARY IDA.WLL imports ....... т.е. файл по типу def-файла |
|
|
Дата: Сен 21, 2004 12:05:42 · Поправил: Asterix А вообще, нужно fasm юзать ;-) ---------------------------------------------------------------------- ------------------- Also, the ordinals are preserved according to the order in which you put the functions after the "export" macro. At the same time, new "import" macro allows you to import by ordinal. For example, the export section of ERRORMSG.DLL example DLL may look like: Code:
export 'ERRORMSG.DLL',\
ShowErrorMessage,'ShowErrorMessage',\ ; ordinal 1
ShowLastError,'ShowLastError' ; ordinal 2
And you can import the ShowLastError function by ordinal this way: Code:
import errormsg,\
ShowLastError,2
---------------------------------------------------------------------- ------------------- |
|
|
Дата: Сен 23, 2004 09:39:27 · Поправил: krid24 Всем огромный спасиб! |
|
|
Дата: Сен 23, 2004 10:18:26 · Поправил: krid24 мелкомягкие могли бы как-нить и попроще, без создания этих псевдо-либов. Пришлось наклепать прогу, которая сама это делает. У Microsoft все - конструктор "сделай сам" :) Quantum Сен 20, 2004 06:28:07 "Зато это имя может быть прописано в *.LIB. Посмотрите символы внутри этой LIB с помощью соответствующих утилит." Кстати, нашел имя этой ф-ции в shell32.pdb, а в .lib'e его нету. |
|
|
Дата: Сен 23, 2004 20:04:20 krid24 Да, я уже заметил. Иначе не было бы необходимости создавать псевдо-либу. |
|
Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.088 |