Передача параметров в DLL [masm32]

Тема в разделе "WASM.BEGINNERS", создана пользователем ActioN, 20 май 2007.

  1. ActioN

    ActioN New Member

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    160
    Адрес:
    Ukraine
    Доброго времени суток, уважаемая аудитория. Впервые приходится работать с dll-ками, поэтому возник вопрос: как передать параметр (адресс строки, находящейся в exe) в dll? Скорее всего надо положить параметр в стек перед вызовом функции из dll, а потом в dll извлечь по адресу ebp+4. Пробовал - не выходит. Подскажите, как это делается.
    P.S. Статистический модуль - это lib-файл, который подключается к exe-шнику, а динамическая библиотека - это dll. Я правильно понял?
     
  2. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    либо esp+4 либо ebp+8, но никак не ebp+4. там адрес возврата. а делается все точно так же, как для обычных функций
    правильно
     
  3. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    ActioN
    *.lib - это может быть статическая библиотека, хотя также может оказаться библиотекой импорта или даже гибридом: импорт + обьектный код. Кстати, упаковывать статические библиотеки в lib-файл не обязательно - обьектники можно хранить и неупакованными и использовать их прямо в процессе линковки вместо lib.
     
  4. ActioN

    ActioN New Member

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    160
    Адрес:
    Ukraine
    Great, Quantum, спасибо, вроде бы разобрался. Хотел уточнить:
    1. При вызове функции из dll в стек ложится 3 параметра: hInstance длл-ки, причина вызова (DLL_THREAD_... / DLL_PROCESS_...) и 3й параметр зарезервирован. Если все 3 параметра типа dword, то как то, что я положил в стек перед вызовом функции оказывается по esp+4? И как различить, в каком случае положенный мною параметр находится, по esp+4 а в каком по ebp+8?
    2. Если уже в коде dll я положил в esi адресс строки, которая находится в exe-шнике, могу ли я после некоторых преобразований ложить по этому же адресу свои какие-нибудь символы, все еще находясь в коде dll-ки?

    Осталось сделать вариант с подключением к exe-файлу lib-библиотеки (длл в этом случае не нужен, правильно?). У вас случайно нету прямых ссылок? беглый поиск по форуму пока что ничего не дал.
     
  5. ActioN

    ActioN New Member

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    160
    Адрес:
    Ukraine
    Может, по esp+0 лежит код возврата к коду в exe-шнике, а по esp+4 положенные мной параметры? А те 3 dword'овых параметра лежат где-то в другом месте...
     
  6. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    1. Ты мысленно себе стек представляешь? На вершину стека всегда указывает esp. Когда ты кладешь параметры в стек, есп уменьшается, когда делаешь возврат из функции (stdcall) - стек очищается!!! Поэтому в любом случае, при передаче параметра функции в стеке будет лежать адрес возврата, потом твой параметр.

    Что же касается есп+4 или ебп+8 - ты видимо совсем не понимаешь сути этих регистров. Есп указывает на вершину стека. Значит при вызове функции параметр будет по есп+4. НО! Многие функции вначале пишут push ebp/mov ebp,esp. Поэтому на параметр можно сослаться через ебп+8, т.к. в стек был положен еще один параметр (вследнствие чего есп уменьшился), а потом ебп был приравнян к есп.

    2. Можешь делать что угодно. Нет понятия символ, число... Это человеческие понятия, т.е. субъективные. В компьютерах есть понятие БАЙТ. Вот по любому адресу (ну почти по любому, но в данном случае "по любому") можно писать любые байты
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Правильно. Просто линкуй с lib и все
     
  8. ActioN

    ActioN New Member

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    160
    Адрес:
    Ukraine
    MSoft, а по присоединению lib-файла к exe ничего не посоветуешь?
     
  9. ActioN

    ActioN New Member

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    160
    Адрес:
    Ukraine
    Great, а можно подробней про линкование с lib? Оно случайно не с помощью такого батника делается?:
    Код (Text):
    1. @echo off
    2.  
    3. if exist tstdll.obj del tstdll.obj
    4. if exist tstdll.dll del tstdll.lib
    5.  
    6. \masm32\bin\ml /c /coff tstdll.asm
    7.  
    8. \masm32\bin\Link /SUBSYSTEM:WINDOWS /DLL /DEF:tstdll.def tstdll.obj
    9.  
    10. dir tstdll.*
    11.  
    12. pause
     
  10. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    сам в этой теме как ежик в тумане. Но кажися делается самым обыкновенным includelib. Тока не забудь прототипы функций описать (хотя возможно этого и не надо).
     
  11. Ultrin Faern

    Ultrin Faern New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2006
    Сообщения:
    170
    Не надо путать DllMain, которую вызывает система, после загрузки Dll, и своих фнкций, которые находятся там-же. Свои функции и их параметры можно рисовать какие угодно. А вот DllMain лучше не трогать.
     
  12. ActioN

    ActioN New Member

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    160
    Адрес:
    Ukraine
    Вместе с созданием dll-файла создается и lib-файл. Бросаю его в папку с проектом, пишу такой код:
    Код (Text):
    1.     includelib tstdll.lib
    2. TestProc PROTO:DWORD
    3. ...
    4.     invoke  TestProc,addr strString
    5. ...
    Компилятор ругается на функцию TestProc. Говорит, что "unresolved external symbol _TestProc@4". В чем может быть дело?
     
  13. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    в масме - да
    это левый батник какой-то=\ зачем он нужен надо еще подумать.
    линкование с lib задается ОДНИМ параметром к link.exe и все! Параметр - имя либы
    Шуруй и изучай как работает стек.
     
  14. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    В том, что такой функции нету у тебя.
     
  15. ActioN

    ActioN New Member

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    160
    Адрес:
    Ukraine
    Это я взял с демок, которые идут с масмом. Там пример программы с dll-кой. Только я изменил в одной строке .dll на .lib. Оказывается, ненадо - lib-файл у меня уже есть.

    Так я же написал прототип после includelib:
    TestProc PROTO:lol: WORD
    Хотя, это компилеру ни о чем не говорит. Надо как-то указать, что должен использоваться lib-файл. Только как это сделать...
     
  16. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    бред
    Функции _TestProc@4 у тебя скорее всего нету, в этом и проблема. Вечная проблема мангинга, в lib'е она скорее всего называется по-другому. Либо _TestProc, либо както еще.
     
  17. ActioN

    ActioN New Member

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    160
    Адрес:
    Ukraine
    Что-то не удается мне создать lib-файл таким способом. Пишу:
    C:\masm32\bin\link.exe /LIB /LIBPATH:c:\Test\ /out:statlib.lib
    Вроде бы файл создался. По крайней мере, ошибок линкер не выдал. Но где этот файл создался? В c:\Test\ нету. Как он определяет, из какого файла надо lib-файл сделать?
     
  18. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Блин, ты спрашивал не про СОЗДАНИЕ, а про ИСПОЛЬЗОВАНИЕ lib. Ты уж определись.

    Создается либо утилитой lib (надстройка над link), либо сразу линком.
    в текущем каталоге, если путь не указан. кстати, LIBPATH лишний параметр
    ЛОооол, а кто за тебя допишет имена объектников?

    Использование - просто линковка с libом. пример:
    link mycoolprog.obj kernel32.lib user32.lib your_lib.lib /SUBSYSTEM:CONSOLE /ALIGN:32 /FIXED /OUT:mycoolprog.exe
     
  19. ActioN

    ActioN New Member

    Публикаций:
    0
    Регистрация:
    1 апр 2005
    Сообщения:
    160
    Адрес:
    Ukraine
    Great, я сам немного запутался. Мне надо сделать статический модуль и динамическую библиотеку (lib и dll) и продемонстрировать использование функций из (lib и dll-файлов) на masm и c++. С dll-кой на масме я уже сделал. Вместе с dll-кой создался и lib-файл. Мне показалось, что может он не подойдет, поэтому только что пробовал по новой создавать lib-файл. Только что-то не создается он. Настроился использовать тот, который с dll-файлом появился.
    В *.rap-файле такая вот строка для линкования с lib-файлом подойдет?:
    3=5,O,$B\LINK.EXE tstdll.lib /SUBSYSTEM:CONSOLE /RELEASE /VERSION:4.0
    Посмотрел содержимое lib-файла - там везде встречается _TestProc@0. Компилер же, судя по его сообщениям, ищет _TestProc@4. А на wasm.ru нет статьи про использование в проекте lib-файла?
     
  20. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    В этом и проблема. Это манглинг stdcall, после собачки идет суммарный объем передаваемых функции параметров в байтах. 4 - скорее всего один параметр, 0 - ни одного. То ест ьлибо ты неверно указал прототип (1 параметр лишний), либо ты при сборке либы неправильно функцию написал