68 / 25 / 7
Регистрация: 13.01.2014
Сообщений: 108
|
||||||||||||||||
1 | ||||||||||||||||
Как объявить прототип зная только адрес функции02.02.2024, 15:51. Показов 1083. Ответов 7
Метки нет (Все метки)
макрос invoke должен знать прототип функции
например при попытке прописать лишний параметр он вызовет ошибку если например нужно функцию инициализировать посредством - GetProcAddress
то как можно объявить прототип этого адреса функции я конечно понимаю что её можно вызывать через - call
но хочется через - invoke чтобы отслеживалось количество параметров объявить обычным способом
не получится выскакивает ошибка о переопределении идентификатора кто в теме подскажите пожалуйста или на masm32 это сделать нельзя
0
|
02.02.2024, 15:51 | |
Ответы с готовыми решениями:
7
Как на фасме объявить прототип пользовательской функции Как отправить данные на устройства, зная только его мак адрес? Объявить прототип функции f1 с 2 аргументами-строками и возвращаемым результатом в виде литерного массива. Объявить прототип функции f1 с 2 аргументами-строками и возвращаемым результатом в виде литерного массива |
Ушел с форума
16339 / 7658 / 1076
Регистрация: 11.11.2010
Сообщений: 13,705
|
|
02.02.2024, 16:58 | 2 |
assch1,
наверное, правильное название темы Как объявить прототип зная только имя функции? Откуда вы можете знать адрес, он еще и меняется динамически... Открою один секрет. Чтобы работать с функцией в masm32/masm64 через invoke прототип можно и не объявлять.
0
|
68 / 25 / 7
Регистрация: 13.01.2014
Сообщений: 108
|
|
02.02.2024, 18:54 [ТС] | 3 |
Скорее всего именно адрес
который собственно и возвращает функция - GetProcAddress а лексему к этому адресу можно придумать любую Честно говоря мне макрос invoke не нужен по тому что я им и не пользуюсь а в теме я его указал только для того чтобы была понятна суть проблемы Я пользуюсь своим транслятором по сути надстройкой перед компилятором который сначала мой код проекта формирует под код ассемблера и потом скармливает его уже основному компилятору MASM32 - ml.exe Синтаксически я объявляю функцию вот так - fun Beep,50,500 Первым проходом транслятор собирает информацию в том числе и типизацию с количеством параметров у функций на основе объявленных прототипов и на втором проходе при формировании листинга уже отслеживает количество заполненных параметров у функций Просто если функцию брать через - GetProcAddress мой транслятор не сможет получить информацию о прототипе функции Но если ответа на мой вопрос по теме не будет то в принципи ничего страшного не произойдёт я просто придумаю для моего транслятора дополнительное объявление прототипов например вот так - PROTO NameFun DWORD,DWORD,DWORD и тогда мой транслятор при первом проходе запомнит эти данные
0
|
Ушел с форума
16339 / 7658 / 1076
Регистрация: 11.11.2010
Сообщений: 13,705
|
|
03.02.2024, 14:44 | 4 |
assch1,
у GetProcAddress два параметра 1) Дескриптор DLL из которой экспортируется функция и 2) Указатель на символьную строку с именем функции. Зная имя, не сложно найти в справочнике и количество параметров передаваемых функции
0
|
68 / 25 / 7
Регистрация: 13.01.2014
Сообщений: 108
|
|||||||||||
03.02.2024, 16:29 [ТС] | 5 | ||||||||||
Mikl___, Спасибо за пояснения
Если кому интересно то небольшое пояснение Моя платформа программирования - MASM32 с той лишь разницей что мой код проекта сначала обрабатывает программа транслятор формируя листинг который потом скармливается основному компилятору MASM32 - ml.exe На первый взгляд этот метод похож на применение пользовательских макросов но на самом деле разница очень большая пользовательские макросы могут многое но к большому сожелению не всё потому что имеют разного рода определённые ограничения у программы транслятора таких ограничений нет от слова совсем В своё время я часто применял свои пользовательские макросы например когда при работе с - OpenGL ради интереса переводил - Уроки от NeNe на - MASM32 несомненно применение макросов значительно упрощали рутину кода проекта но дело всё в том что обработкой макросов занимается - ml.exe и соответственно тратит на них определённое время при небольших проектах это конечно незаметно но однажды время компиляции какого то урока показало 2000 миллисекунд 2 секунды это конечно не критично но всё же было досадно я понимал что это всё из за тяжеловесных макросов с которыми приходится работать компилятору - ml.exe Я подумал а что если написать транслятор который будет формировать код проекта в котором не нужно будет делать лишнею работу компилятору - ml.exe результат превзошёл все мои ожидания работа транслятора плюс работа компилятора - ml.exe того же самого кода составила - 100 миллисекунд то есть в 20 раз быстрее с тех пор я давно забыл про макросы и только периодически обновляю программу транслятора новыми возможностями Для моего транслятора начальные регистро-независимые символы - fun по сути являются директивой которая под капотом записывает в листинг объявляемую функцию посредством команды - call и соответственно при наличии аргументов командой - push Утрированный но показательный пример ухода от рутины кода: Предположим я в коде у себя объявил библиотеку - lib glu32 и воспользовался в проекте функцией из этой библиотеки - gluPerspective мой транслятор при первоначальном сборе информации зафиксирует прототип этой функции gluPerspective PROTO :double,:double,:double,:double Само объявление прописывать в проекте не нужно транслятор сам найдёт этот прототип в подключённых библиотеках И при объявлении этой функции в проекте
транслятор вызовет ошибку но если всё правильно то зная типизацию каждого аргумента и имея на борту определённые алгоритмы под капотом на этом месте в листинг запишется код
то директива - fun обработку будет делать по умолчанию то есть каждый аргумент будет обработан как тип - dword и отслеживание количества аргументов происходить не будет по сути ответственность будет только на программисте Чаще всего транслятор знает о прототипах функций проекта исключением является лишь тот случай если адрес функции взят через - GetProcAddress Предположим мы взяли адрес функции и поместили его в лексему - NameFun прописывать прототип функции в проекте необязательно но в определённых случаях желательно иметь прототип функции к примеру у функции четыре параметра и только первый аргумент - dword при объявление прототипа в лоб NameFun PROTO :dword,:float,:double,:qword Компилятор вызовет ошибку уникальности имён по этому я и создал эту тему Но по сути я решил эту проблему для себя я буду объявлять прототип таких функций в проекте обычным способом за исключением одной детали имя функции будет иметь сигнатурный префикс прямого слеша |NameFun PROTO :dword,:dword,:dword Транслятор увидев объявление прототипа функции таким способом запомнит эти данные прототипа а под капотом просто закоментирует эту строку в листинге
0
|
Модератор
|
||||||
03.02.2024, 16:37 | 6 | |||||
На форуме masm32 видел такой вариант:
https://masm32.com/board/index... 7#msg52707
1
|
68 / 25 / 7
Регистрация: 13.01.2014
Сообщений: 108
|
|
03.02.2024, 18:33 [ТС] | 7 |
ФедосеевПавел, Спасибо за участие
Попробую проанализировать Добавлено через 35 минут Отличный метод Он снимает проблему уникальности имён Ещё раз Спасибо ФедосеевПавел, Век живи век учись Добавлено через 1 час 13 минут После тестовых операций я понял что этот метод сработает только для макроса - invoke и то если параметр будет не больше 4-байта например если параметр в прототипе будет указан как - real8 или qword то вызовется ошибка потому что как я понял макрос - invoke может принять такой параметр только за два раза (хотя не исключено что я ошибаюсь) По сути это и есть преимущество транслятора который легко это обойдёт и сделает он это просто при помощи добавления сигнатурного префикса прямого слеша при банальном объявлении прототипа И как я уже писал выше транслятор увидев объявление прототипа функции таким способом запомнит эти данные прототипа а под капотом просто закоментирует эту строку в листинге Я уже внёс этот функционал в свой транслятор и как показали тесты всё работает без проблем
0
|
Модератор
|
|
03.02.2024, 18:44 | 8 |
Где-то встречал пример с передачей через invoke чисел типа real8.
Кажется, эти числа передавались не напрямую, а через макрос или макрос-функцию. Но при этом возникали другие неудобства. Кажется, макрос называется FP() ...
0
|
03.02.2024, 18:44 | |
03.02.2024, 18:44 | |
Помогаю со студенческими работами здесь
8
Как правильно объявить прототип функций Узнать адрес функции 2, зная адрес функции 1 Как найти ip адрес устройства в локальной сети зная его MAC адрес? Как отправить файл на сервер через FTP не зная имени а зная только расширение файла? Как определить IP-адрес сети, зная IP-адрес узла назначения и маску сети Прототип с символьным указателем (объявить) Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |