Есть DLL'ка и imported .LIB для нее. DLL'ка экспортирует функцию по ordinal'у (без имени). Вопрос: как импортировать такую функцию в свою asm прогу? (т.е, что надо прописать в .asm и/или .def ? Или как-то по-другому?). Спасибо.
krid24 Зато это имя может быть прописано в *.LIB. Посмотрите символы внутри этой LIB с помощью соответствующих утилит. .DEF - это для экспорта, а не для импорта.
Вот конкретный пример: есть в SHELL32.DLL функция, которая показывает диалог выбора иконки (как в свойствах ярлыка -> изменить значок). В SHELL32 эта ф-ция экспортируется не по имени, а по ординалу 62 (если кому интересно, вот прототип (имя произвольное): Код (Text): 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) - нет. Поможите, люди добрые.
krid24 Угу. Если мне память не изменяет, то в MSDN про это что-то мутное написано... Короче, этот раздел ничего полезного не делает. Первым делом нужно определить символ _PickIconDlg@16 в либе, т.е. сгенерировать свой shell32.lib. Можно так: Код (Text): ; 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. Итак, тестовая прога: Код (Text): .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!
Quantum > Если мне память не изменяет, то в MSDN про это что-то мутное написано... Короче, этот раздел ничего полезного не делает. В Ида SDK в папке bin\w32 лежит файл IDA.IMP, в нем написано Код (Text): LIBRARY IDA.WLL imports ....... т.е. файл по типу def-файла
А вообще, нужно 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: Код (Text): Code: export 'ERRORMSG.DLL',\ ShowErrorMessage,'ShowErrorMessage',\ ; ordinal 1 ShowLastError,'ShowLastError' ; ordinal 2 And you can import the ShowLastError function by ordinal this way: Код (Text): Code: import errormsg,\ ShowLastError,2 ---------------------------------------------------------------------- -------------------
мелкомягкие могли бы как-нить и попроще, без создания этих псевдо-либов. Пришлось наклепать прогу, которая сама это делает. У Microsoft все - конструктор "сделай сам" Quantum Сен 20, 2004 06:28:07 "Зато это имя может быть прописано в *.LIB. Посмотрите символы внутри этой LIB с помощью соответствующих утилит." Кстати, нашел имя этой ф-ции в shell32.pdb, а в .lib'e его нету.