Импортирую свою функцию из своей DLL, но вопрос, а как её invoke'нуть?

Тема в разделе "WASM.BEGINNERS", создана пользователем Meatcoins, 8 ноя 2008.

  1. Meatcoins

    Meatcoins New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    178
    Импортирую свою функцию из своей DLL, но вопрос, а как её invoke'нуть?

    Код (Text):
    1. includelib extr.lib
    2. extrn   _imp__my@4:dword
    3. my equ _imp__my@4
    4. ;my PROTO :DWORD
    5.  
    6. ......
    7. ......
    8. ;invoke my,eax
    На my PROTO :lol: WORD MASM ругается - говорит symbol redifinition!
    Соответственно и invoke не работает!
    Посмотрел описания kernel32.inc - вроде бы там тоже самое написано!
    Всё аналогично, а не работает почему-то...
     
  2. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    Meatcoins
    я с масмом не дружу, но разве так не работает?:
    Код (Text):
    1. includelib extr.lib
    2. my PROTO :DWORD
    3. invoke my,eax
     
  3. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Meatcoins
    В штатных инклюдах как у meduza и всё работает.
    Если без лишних call на jmp то
    externdef _imp__my@4:PTR pr1
    my equ <_imp__my@4>
    уже без proto тоже работает если есть includelib extr.lib
     
  4. Meatcoins

    Meatcoins New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    178
    Не... что-то не так...
    Код (Text):
    1. includelib extr.lib
    2. externdef _imp__my@4:dword
    3. my equ <_imp__my@4>
    4.  
    5. ...
    6. ...
    7. ...
    8. invoke my,eax
    ERROR: INVOKE requires prototype for procedure!

    А если так:
    Код (Text):
    1. includelib extr.lib
    2. externdef _imp__my@4:dword
    3. my equ <_imp__my@4>
    4. my PROTO :DWORD
    5.  
    6. ...
    7. ...
    8. ...
    9. invoke my,eax
    То:
    ERROR: symbol redifinition: _imp__my@4!

    Так функция не экспортируется!
    Тут просто другая my определяется - это не то...
    Что неужели никто свои библиотеки не писал и из них функции свои не invoke'кал???
     
  5. meduza

    meduza New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2008
    Сообщения:
    212
    конечно, чтобы invoke'нуть нужен прототип

    конечно, у тебя два раза определяется my, компилятор не знает что считать my

    другая? вы че то путаете. Линкер все соберет как надо.

    писал, инвокал, способом который уже писал.
     
  6. Meatcoins

    Meatcoins New Member

    Публикаций:
    0
    Регистрация:
    19 сен 2007
    Сообщения:
    178
    Да! Работает!

    Но вот, что интересно:
    Когда у меня написано вот так:
    Код (Text):
    1. includelib extr.lib
    2. extrn   _imp__my@12:dword
    3. my equ _imp__my@12
    То invoke не работает приходится делать так:
    Код (Text):
    1. push ...
    2. push ...
    3. push ...
    4. call my
    В дизасемблере получается следующее: call dword ptr ds:[00402010]
    А по адресу 402010 находится dword=100015FB - адрес функции.
    По адресу 402000 находится секция, которая называется .rdata и содержит imports.
    Это IAT?

    А когда у меня написано вот так:
    Код (Text):
    1. includelib extr.lib
    2. my PROTO :DWORD,:DWORD,:DWORD
    То invoke работает, но почему-то вызов моей функции происходит как у всех функций - через jmp (call <jmp>)!
    А в предыдущем случае управление передаётся сразу! Просто интересно почему так... можно сказать для общего развития...