Импортирую свою функцию из своей DLL, но вопрос, а как её invoke'нуть? Код (Text): includelib extr.lib extrn _imp__my@4:dword my equ _imp__my@4 ;my PROTO :DWORD ...... ...... ;invoke my,eax На my PROTO WORD MASM ругается - говорит symbol redifinition! Соответственно и invoke не работает! Посмотрел описания kernel32.inc - вроде бы там тоже самое написано! Всё аналогично, а не работает почему-то...
Meatcoins я с масмом не дружу, но разве так не работает?: Код (Text): includelib extr.lib my PROTO :DWORD invoke my,eax
Meatcoins В штатных инклюдах как у meduza и всё работает. Если без лишних call на jmp то externdef _imp__my@4:PTR pr1 my equ <_imp__my@4> уже без proto тоже работает если есть includelib extr.lib
Не... что-то не так... Код (Text): includelib extr.lib externdef _imp__my@4:dword my equ <_imp__my@4> ... ... ... invoke my,eax ERROR: INVOKE requires prototype for procedure! А если так: Код (Text): includelib extr.lib externdef _imp__my@4:dword my equ <_imp__my@4> my PROTO :DWORD ... ... ... invoke my,eax То: ERROR: symbol redifinition: _imp__my@4! Так функция не экспортируется! Тут просто другая my определяется - это не то... Что неужели никто свои библиотеки не писал и из них функции свои не invoke'кал???
конечно, чтобы invoke'нуть нужен прототип конечно, у тебя два раза определяется my, компилятор не знает что считать my другая? вы че то путаете. Линкер все соберет как надо. писал, инвокал, способом который уже писал.
Да! Работает! Но вот, что интересно: Когда у меня написано вот так: Код (Text): includelib extr.lib extrn _imp__my@12:dword my equ _imp__my@12 То invoke не работает приходится делать так: Код (Text): push ... push ... push ... call my В дизасемблере получается следующее: call dword ptr ds:[00402010] А по адресу 402010 находится dword=100015FB - адрес функции. По адресу 402000 находится секция, которая называется .rdata и содержит imports. Это IAT? А когда у меня написано вот так: Код (Text): includelib extr.lib my PROTO :DWORD,:DWORD,:DWORD То invoke работает, но почему-то вызов моей функции происходит как у всех функций - через jmp (call <jmp>)! А в предыдущем случае управление передаётся сразу! Просто интересно почему так... можно сказать для общего развития...