Вопрос покажется некоторым глупым, но все же: есть dll-ка и есть ехе-шник. Так вот вопрос: как использовать переменные, объявленные в exe-шке, в динамической библиотеке и наоборот? Т.е. что-то типа: EXE: Код (Text): .data var db 1 ... .code invoke LoadLibrary,addr filelib mov hLib, eax invoke GetProcAddress,eax, addr finddrive call eax ;var уже равна 0 после вызова finddrive ... DLL: Код (Text): ... finddrive proc mov var, 0 finddrive endp ...
Вообще, изменение глобальных переменных не основной программой - это очень плохой тон в программировании (чревато багами, которые очень сложно найти). Но 1) Создаем струтуру, со всеми переменными которые хочеться иметь в длл. 2) Определяем ее в данных ехе. 2) После загрузки длл, вызываем написанную нами функцию, которая принимает адрес начала определенной структуры, и сохраняет у себя. 3) Дальнейший доступ к переменным струтуры - используем указазнный начальный адрес.
Ultrin Faern Адрес будет фиксированным, т.к. данные хранятся в экзешнике. Поэтому, можно обойтись и без дополнительной функции, но придётся при каждой компиляции экзешника пересчитывать данный адрес. Наверно, можно, как вариант, данные экспортировать из экзешника и импортировать в DLL.
А примерчик какой-нибудь дайте. И не пойму: как вообще тогда происходит передача данных между экзешником и дллкой? Получается в дллке выполняются процедуры как в отдельной экзешке?
Какой фиксированный адрес? EXE может быть загружен с любого адреса (и не следует привязываться к стандартному адресу загрузки). ДЛЛ это и есть дополнительные процедуры для ЕХЕ. Поэтому вся передача данных идет через параметры вызванных функций. Но ДЛЛ разделяет с ЕХЕ одно адресное пространство, поэтому, например, абсолютный адрес 12345 для ЕХЕ и для ДЛЛ содержат одни и те-же данные. Когда грузится ДЛЛ, она не знает в какой ЕХЕ ее грузят, и соответственно от ЕХЕ (если ему надо поделиться данными) нужно сказать ДЛЛ где они находятся. ЗЫ для особо ревносных: ясное дело, что это упрощенное объяснение, и возможны всякие извращения...
Конкретный ехе будет грузится по конкретному(неизменному) адресу. Это, наверное, dll для конкретного ехе, так что она будет знать куда она загрузилась. Вариант выдача ссылки на структуру имхо самый нормальный.
KondraT, если библиотека родная, тогда можно и через регистры. А если чужая, то только через EAX. В EАX, например, может быть адрес структуры, в которой хранятся все нужные тебе данные
У меня тоже вопрос, касающийся EXE и DLL. Я делаю "плагин" для EXE, изначально плагины не поддерживавшего (мне не желательно модифицировать EXE, поэтому я использую то, что EXE грузит через LoadLibrary некую DLL, которой я и притворяюсь). DLL пишу на C, а чтобы не заморачиваться с указателями, делаю на фасме объектник типа "public var as '_var' / label var at 0xSOMEWHERE" и работаю с глобальными переменными, вызываю функции EXE напрямую. Существует ли линкер, который можно попросить генерировать мне правильные REL32-релокейшны для адресов ниже базового адреса DLL?
iZzz32 Если я правильно понял, var указывает внутрь экзешника. Этот адрес постоянен. Зачем тогда релокации? Кстати, отрицательные фиксапы, если я правильно помню (давно не перечитывал документацию), просто не предусмотрены в COFF.
Quantum, релокации я хотел для вызовов функций, но раз уж всё так плохо, придётся генерировать обёртки для каждой функции или запретить перемещение DLL.