Конвенции вызова - как решить

Тема в разделе "LANGS.C", создана пользователем M0rg0t, 14 июн 2022.

  1. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    Есть код, который получает адреса функций динамически (LoadLib+GetProcAdr). Т.е. стандартное объявление типа и так далее.
    Код (C):
    1.  
    2. typedef int(__cdecl *fn_somefunction)(const char *filename);
    3. fn_somefunction pfn_somefunction;
    4. pfn_somefunction= (fn_somefunction)GetProcAddress(hLib, "somefunction");
    Проблема в том, что библиотека может быть один раз cdecl, а другой раз stdcall, не поймешь пока не попадешь на машину. Если библиотека будет stdcall, то код выше выполнится, но при вызове функции программа ес-но упадет, т.к. компилятор выровняет стек не там, где надо. Как быть? Реально ли что-то придумать или в Си такое не доступно?
    --- Сообщение объединено, 14 июн 2022 ---
    нет, понятно можно закодить враппер, который будет смотреть, какая библиотека инициализирована, и вызывать уже __cdecl или _stdcall вариант внутри себя. но тут много лишнего кода.
     
  2. f13nd

    f13nd Well-Known Member

    Публикаций:
    0
    Регистрация:
    22 июн 2009
    Сообщения:
    1.991
    Вообще если программа будет считать функцию stdcall'ом, а на самом деле там cdecl, то разросшийся стек в принципе фатальных проблем не создаст, если пролог и эпилог вызывающей фукнции выглядят так:
    Код (Text):
    1. push ebp
    2. mov ebp,esp
    3. ...
    4. leave
    5. retn
    , а локальные переменные адресуются по ebp. Это, насколько я могу судить, можно накрутить в настройках компилера.

    ЗЫ: только за переполнение стека стоит переживать, если таких вызовов будет сделано много. Процедуры-прокладки кстати с нужным прологом и эпилогом и эту проблему снимут.
     
    Последнее редактирование: 14 июн 2022
    M0rg0t нравится это.
  3. Rel

    Rel Well-Known Member

    Публикаций:
    2
    Регистрация:
    11 дек 2008
    Сообщения:
    5.321
    Может сделать два варианта вызова функции, VEH'ом отловить эксепшн и выбирать тот вариант, который этот эксепшн не вызвал?
     
  4. M0rg0t

    M0rg0t Well-Known Member

    Публикаций:
    0
    Регистрация:
    18 окт 2010
    Сообщения:
    1.576
    f13nd, да, наверное остановлюсь на прокладках.

    Rel, интересное решение конечно, но избыточное; проще уж прокладки закодить.