Общие переменные в EXE и DLL

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

  1. KondraT

    KondraT Member

    Публикаций:
    0
    Регистрация:
    22 янв 2006
    Сообщения:
    175
    Вопрос покажется некоторым глупым, но все же: есть dll-ка и есть ехе-шник. Так вот вопрос: как использовать переменные, объявленные в exe-шке, в динамической библиотеке и наоборот? Т.е. что-то типа:
    EXE:
    Код (Text):
    1. .data
    2. var db 1
    3. ...
    4. .code
    5. invoke LoadLibrary,addr filelib
    6. mov hLib, eax
    7. invoke GetProcAddress,eax, addr finddrive
    8. call eax
    9. ;var уже равна 0 после вызова finddrive
    10. ...
    DLL:
    Код (Text):
    1. ...
    2. finddrive proc
    3. mov var, 0
    4. finddrive endp
    5. ...
     
  2. Ultrin Faern

    Ultrin Faern New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2006
    Сообщения:
    170
    Вообще, изменение глобальных переменных не основной программой - это очень плохой тон в программировании (чревато багами, которые очень сложно найти).

    Но
    1) Создаем струтуру, со всеми переменными которые хочеться иметь в длл.
    2) Определяем ее в данных ехе.
    2) После загрузки длл, вызываем написанную нами функцию, которая принимает адрес начала определенной структуры, и сохраняет у себя.
    3) Дальнейший доступ к переменным струтуры - используем указазнный начальный адрес.
     
  3. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    Ultrin Faern
    Адрес будет фиксированным, т.к. данные хранятся в экзешнике. Поэтому, можно обойтись и без дополнительной функции, но придётся при каждой компиляции экзешника пересчитывать данный адрес.

    Наверно, можно, как вариант, данные экспортировать из экзешника и импортировать в DLL.
     
  4. KondraT

    KondraT Member

    Публикаций:
    0
    Регистрация:
    22 янв 2006
    Сообщения:
    175
    А примерчик какой-нибудь дайте. И не пойму: как вообще тогда происходит передача данных между экзешником и дллкой? Получается в дллке выполняются процедуры как в отдельной экзешке?
     
  5. Ultrin Faern

    Ultrin Faern New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2006
    Сообщения:
    170
    Какой фиксированный адрес? EXE может быть загружен с любого адреса (и не следует привязываться к стандартному адресу загрузки).

    ДЛЛ это и есть дополнительные процедуры для ЕХЕ. Поэтому вся передача данных идет через параметры вызванных функций. Но ДЛЛ разделяет с ЕХЕ одно адресное пространство, поэтому, например, абсолютный адрес 12345 для ЕХЕ и для ДЛЛ содержат одни и те-же данные.

    Когда грузится ДЛЛ, она не знает в какой ЕХЕ ее грузят, и соответственно от ЕХЕ (если ему надо поделиться данными) нужно сказать ДЛЛ где они находятся.

    ЗЫ для особо ревносных: ясное дело, что это упрощенное объяснение, и возможны всякие извращения... ;)
     
  6. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Конкретный ехе будет грузится по конкретному(неизменному) адресу.

    Это, наверное, dll для конкретного ехе, так что она будет знать куда она загрузилась.

    Вариант выдача ссылки на структуру имхо самый нормальный.
     
  7. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    не путаешь с dll ?
     
  8. asmfan

    asmfan New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2006
    Сообщения:
    1.004
    Адрес:
    Abaddon
    А кто сказал, что ехе не может иметь фиксапов/релоков?)
     
  9. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    asmfan
    Всё равно.
     
  10. KondraT

    KondraT Member

    Публикаций:
    0
    Регистрация:
    22 янв 2006
    Сообщения:
    175
    Понятно. А возврат данных как? Только через регистры?
     
  11. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    KondraT, если библиотека родная, тогда можно и через регистры. А если чужая, то только через EAX. В EАX, например, может быть адрес структуры, в которой хранятся все нужные тебе данные
     
  12. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    У меня тоже вопрос, касающийся EXE и DLL. Я делаю "плагин" для EXE, изначально плагины не поддерживавшего (мне не желательно модифицировать EXE, поэтому я использую то, что EXE грузит через LoadLibrary некую DLL, которой я и притворяюсь). DLL пишу на C, а чтобы не заморачиваться с указателями, делаю на фасме объектник типа "public var as '_var' / label var at 0xSOMEWHERE" и работаю с глобальными переменными, вызываю функции EXE напрямую. Существует ли линкер, который можно попросить генерировать мне правильные REL32-релокейшны для адресов ниже базового адреса DLL?
     
  13. Quantum

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

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    iZzz32
    Если я правильно понял, var указывает внутрь экзешника. Этот адрес постоянен. Зачем тогда релокации? Кстати, отрицательные фиксапы, если я правильно помню (давно не перечитывал документацию), просто не предусмотрены в COFF.
     
  14. iZzz32

    iZzz32 Sergey Sfeli

    Публикаций:
    0
    Регистрация:
    3 сен 2006
    Сообщения:
    355
    Quantum, релокации я хотел для вызовов функций, но раз уж всё так плохо, придётся генерировать обёртки для каждой функции или запретить перемещение DLL.