Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: получение функции из длл  (Прочитано 8346 раз)
0 Пользователей и 1 Гость смотрят эту тему.
alw
Гость
« : 20-04-2006 15:52 » 

прошу сильно не пинать тк с ассемблером лет 20 дела не имел, но тут попался usb девайс на ft245, хочу его куда нибудь пристроить.
текст взят из примера к масму , первая команда FT_OK возвращает ,а вторая нет, видимо неправильно передан  Handl, почему не пойму ,хотя в Си-шном варианте работает.

 LOCAL hLib  :DWORD
 LOCAL Handl  :DWORD
 FT_OK equ 0
            ; -------------------
            ; Direct call the DLL
            ; -------------------
   jmp @F   
      libName  db "Ftd2xx.dll",0       ;            Си  прототипы  возвращают  FT_Status
     FuncName db "FT_Open",0     ;       FT_Status   FT_Open(0,FT_Handle * ftHandl)
     FuncName1 db "FT_ResetDevice",0 ; FT_Status FT_ResetDevice (FT_Handle   ftHandl)
            @@:
          invoke LoadLibrary,ADDR libName
          mov hLib, eax
          invoke GetProcAddress,hLib,ADDR FuncName
          push Handl
          push  0
          call eax
          pop ebx
           invoke GetProcAddress,hLib,ADDR FuncName1
          push [ebx]
          call eax
       ; тут не ОК
          .if eax==FT_OK
            szText TheMsg,"FT_OK"
            invoke MessageBox,hWin,ADDR TheMsg,ADDR szDisplayName,MB_OK
          .endif
            invoke FreeLibrary,hLib
 
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 20-04-2006 16:35 » 

alw, рекомендую воспользоваться отладчиком. Поставь точку останова на входе ф-ии и проиди ее в пошаговом режиме, проверяя данные до и после всех команд call.
Проверки результатов работы LoadLibrary и GetProcAddress в коде так же были бы не лишними.
Потом, видел ли ты код (или спецификацию) ф-ий FT_Open и FT_ResetDevice?
« Последнее редактирование: 20-04-2006 16:37 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
alw
Гость
« Ответ #2 : 21-04-2006 05:46 » 

Cпасибо буду пробовать, просто хотел проверить правильно ли я понимаю следующий момент.
Спецификация функций  приведена в тексте , FT_Open в первом параметре передает номер устройства , во втором возвращается указатель на хендл устройства, параметр второй функции этот хендл. Первая отрабатывает нормально в еах =0, и в стек должна записать адрес ячейки в которой находится хендл, тк он находится в вешине стека командой pop записываю его в евх и потом содержимое этого адреса те хендл записываю в стек для второй функции push [ebx].Может быть в чем-то я ошибаюсь ?
Записан
alw
Гость
« Ответ #3 : 21-04-2006 08:13 » 

с pop напутал ,но результат не изменился.
Записан
Dimitry
Гость
« Ответ #4 : 11-09-2006 16:40 » new

При вызове первой функции нужно поместить в стек адрес переменной, в которую будет записан описатель (handle) устройства, а не значение этой перемнной(вместо push Handle правильно push offset Handle):

push offset Handle
push 0
call eax ; FT_Open

Теперь перемнная Handle должна содержать описатель, который нужно передать второй функции. Накакой команды pop после вызова первой функции не нужно - функции сами очищают за собой стек от своих аргументов и не записывают туда ничего нового(если используется конвенция stdcall)!

push Handle
call eax ; FT_ResetDevice
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines