Соглашения о вызовах cdecl stdcall в 64 бит

Простейшие вопросы в области инженерной разработки
Ответить
AndreyDmitriev

Activity Professionalism Tutorials Gold Black
VIP
VIP
Сообщения: 1327
Зарегистрирован: 03 фев 2010, 00:42
Награды: 6
Версия LabVIEW: 6.1 - 2024
Откуда: Германия
Благодарил (а): 1 раз
Поблагодарили: 38 раз
Контактная информация:

Соглашения о вызовах cdecl stdcall в 64 бит

Сообщение AndreyDmitriev »

О, сколько нам открытий чудных...
Намедни переводил один древний проект на 64 бит, там по ходу дела использовась пара самописных библиотек. Ну всё как обычно - словил исключение, нашёл и поправил. Всё в конечном итоге заработало, но в голове засела мысль о том, что я видел что-то, чего не должен был видеть. А потом сообразил - у меня в коде библиотеки функции __cdecl, а при вызове из LabVIEW один из вызовов я неверно установил в stdcall. И оно при этом работает, а должно по идее падать. Набросал маленькую тестовую библиотеку, посмотрел на листинг ассемблера и точно — неважно как вы объявляете cdecl или stdcall - код там будет ровно один и тот же. Полез в документацию — так и есть, в x64 соглашение о вызовах изменили, больше нет cdecl и stdcall.

Я это к тому, что если вы работаете исключительно в 64-x битной LabVIEW, делаете свои библиотеки, при этом не упираетесь в совместимость c 32 бит и не планируете открывать код в 32 бит LabVIEW, то в общем-то глубоко пофиг, ставите ли вы там С или stdcall — работать будет и так и сяк. Конечно, не стоит раскладывать "бомбы" про проекту и для аккуратности можно ставить WinAPI при вызове функций из user32 kernel32 и т.д., но в случае 64-х бит эта опция ни на что не влияет. И в случае падения при вызове функции не нужно тратить время на проверку соглашений.

Изображение

Самое забавное - что я кучу библиотек сделал и всегда педантично следил за соглашениями, и ни разу не заглянул "под капот" 64 бит библиотеки, будучи свято уверен, что там всё ровно также как и в случае 32 бит. Вот ведь не новичок вроде, и спецификации этой лет пятнадцать уже, если не больше, но как-то прошло мимо меня. Забавно.
Аватара пользователя
dadreamer

Activity Professionalism Автор
professor
professor
Сообщения: 3926
Зарегистрирован: 17 фев 2013, 16:33
Награды: 4
Версия LabVIEW: 2.5 — 2022
Благодарил (а): 11 раз
Поблагодарили: 126 раз
Контактная информация:

Re: Соглашения о вызовах cdecl stdcall в 64 бит

Сообщение dadreamer »

Я это открытие сделал где-то лет 6 назад, когда решил вызвать стороннюю библиотеку из-под 64-битного :labview: , а "дружелюбных" обёрток для неё не было. Оказалось, что не только соглашение о вызове одно, а ещё и можно теперь вызывать thiscall-функции, например C++ методы классов и не надо даже писать собственную обёртку. Я об этом кратко писал тут и тут ещё. На Linux и macOS, кстати, this тоже первым параметром идёт, но как там это работает, я не проверял ни разу.
Ответить

Вернуться в «Для чайников»