Есть код, который получает адреса функций динамически (LoadLib+GetProcAdr). Т.е. стандартное объявление типа и так далее. Код (C): typedef int(__cdecl *fn_somefunction)(const char *filename); fn_somefunction pfn_somefunction; pfn_somefunction= (fn_somefunction)GetProcAddress(hLib, "somefunction"); Проблема в том, что библиотека может быть один раз cdecl, а другой раз stdcall, не поймешь пока не попадешь на машину. Если библиотека будет stdcall, то код выше выполнится, но при вызове функции программа ес-но упадет, т.к. компилятор выровняет стек не там, где надо. Как быть? Реально ли что-то придумать или в Си такое не доступно? --- Сообщение объединено, 14 июн 2022 --- нет, понятно можно закодить враппер, который будет смотреть, какая библиотека инициализирована, и вызывать уже __cdecl или _stdcall вариант внутри себя. но тут много лишнего кода.
Вообще если программа будет считать функцию stdcall'ом, а на самом деле там cdecl, то разросшийся стек в принципе фатальных проблем не создаст, если пролог и эпилог вызывающей фукнции выглядят так: Код (Text): push ebp mov ebp,esp ... leave retn , а локальные переменные адресуются по ebp. Это, насколько я могу судить, можно накрутить в настройках компилера. ЗЫ: только за переполнение стека стоит переживать, если таких вызовов будет сделано много. Процедуры-прокладки кстати с нужным прологом и эпилогом и эту проблему снимут.
Может сделать два варианта вызова функции, VEH'ом отловить эксепшн и выбирать тот вариант, который этот эксепшн не вызвал?
f13nd, да, наверное остановлюсь на прокладках. Rel, интересное решение конечно, но избыточное; проще уж прокладки закодить.