1. Уважаемые гости и пользователи форума.
    Администрация настоятельно рекомендует не регистрировать несколько аккаунтов для одного пользователя. При выявлении наличия мультиаккаунтов будут заблокированы все учетные записи данного пользователя.
    Аккаунты, зарегистрированные на временную почту будут также заблокированы.

Вопрос Как вызвать callback функцию в inno setup из c++ кода

Тема в разделе "C/C++", создана пользователем L-e-o-N, 20 янв 2018.

Метки:
  1. Пользователь

    Регистрация:
    1 дек 2015
    Сообщения:
    216
    Симпатии:
    71
    Пол:
    Мужской
    Пишу небольшую библиотеку на c++.
    в inno setup есть тип:
    type
    Код (Inno):
    TCallFunction=procedure (variable:string);
    и функция в библиотеке:
    Код (Inno):
    function LibRunFunc(var1, var2, var3, var4:string; handle:HWND, callFunc:TCallFunction):boolean; external 'LibRunFunc@files:library.dll stdcall';
     
    Как в с++ коде принять и вызвать последний аргумент?
    Заранее скажу что принять и вызвать void(*fnc)(char[]) не получилось
     
    Последнее редактирование: 21 янв 2018
  2. Пользователь

    Регистрация:
    1 дек 2015
    Сообщения:
    216
    Симпатии:
    71
    Пол:
    Мужской
    Никто не знает?
     
  3. Безумный Лорд Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    746
    Симпатии:
    1.094
    Пол:
    Мужской
    На дняъ напишу, скину пример, если ещё акутально
     
    Nemko и YURSHAT нравится это.
  4. Пользователь

    Регистрация:
    1 дек 2015
    Сообщения:
    216
    Симпатии:
    71
    Пол:
    Мужской
    Да ещё актуально
     
  5. Безумный Лорд Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    746
    Симпатии:
    1.094
    Пол:
    Мужской
    Пример в архиве
     

    Вложения:

    L-e-o-N, Paul, YURSHAT и ещё 1-му нравится это.
  6. Пользователь

    Регистрация:
    1 дек 2015
    Сообщения:
    216
    Симпатии:
    71
    Пол:
    Мужской
    Спасибо, когда искал в интернете информацию, по этому поводу ничего подобного не нашел
    Насколько я понимаю испльзование функции VirtualAlloc есть обязательным из за флага PAGE_EXECUTE_READWRITE, другие функции по выдилению памяти не пойдут?
     
  7. Безумный Лорд Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    746
    Симпатии:
    1.094
    Пол:
    Мужской
    Да, память должна быть executable, иначе получим вылет. Здесь коллбэк для функции одного аргумента. Для большего количества надо добавлять свой обработчик.
     
    L-e-o-N нравится это.
  8. Пользователь

    Регистрация:
    1 дек 2015
    Сообщения:
    216
    Симпатии:
    71
    Пол:
    Мужской
    Я так понимаю, под обработчиком вы имеете в виду то что находиться в масиве call1, если да то по каким правилам передавать аргументы (я вижу что первый аргумент передаеться через регистр edx, а как быть с остальными)?
    И последний вопрос: зачем использовать всю эту муть с машинным кодом, если c++ позволяет делать ассемблерные вставки (правда только под 32 битные приложения)?
     
  9. Безумный Лорд Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    746
    Симпатии:
    1.094
    Пол:
    Мужской
    Да, обработчик в call1. Первый аргумент edx, второй в ecx, последующие на стеке, вот только порядок не помню. Вроде пушатся в стек начиная с последнего аргумента.

    Ну можно и через inline asm, просто так будет компилироваться под любым компилятором. Размер кода строго фиксирован и не зависит от компилятора и его настроек
     
    Nemko и L-e-o-N нравится это.
  10. Пользователь

    Регистрация:
    1 дек 2015
    Сообщения:
    216
    Симпатии:
    71
    Пол:
    Мужской
    Это определяеться соглашением вызовов stdcall там аргументы передаються с права на лево (с последнего аргумента)
    А вообще спасибо :hi:
     
  11. Безумный Лорд Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    746
    Симпатии:
    1.094
    Пол:
    Мужской
    У stdcall все аргументы передаются на стеке, справа налево.
    Я про fastcall забыл. В дельфи, и инке fastcall используется. Поэтому и приходится городить огород чтобы вызвать колбэк.
     
    L-e-o-N нравится это.
  12. Пользователь

    Регистрация:
    1 дек 2015
    Сообщения:
    216
    Симпатии:
    71
    Пол:
    Мужской
    Не знаю как остальные компиляторы, но msvc разрешает использовать fastcall
     
  13. Безумный Лорд Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    746
    Симпатии:
    1.094
    Пол:
    Мужской
    L-e-o-N, можешь поэкспериментировать :hi:

    ЗЫ У msvc, gcc и delphi разные реализации fastcall
     
    Последнее редактирование: 29 июл 2019
  14. Пользователь

    Регистрация:
    1 дек 2015
    Сообщения:
    216
    Симпатии:
    71
    Пол:
    Мужской
    Да, я уже заметил. В msvc первый аргумент идет в ecx а второй в edx (в Inno наоборот)
    По этому с функцией с одним параметром только через asm
    В функций с двумя и больше параметрами первые два аргумента меняються местами, а так работает
    Прилагаю код (библиотека большая, потому что это debug версия)
     

    Вложения:

    Nemko и Shegorat нравится это.
  15. Безумный Лорд Администратор

    Регистрация:
    15 июн 2011
    Сообщения:
    746
    Симпатии:
    1.094
    Пол:
    Мужской
    В дельфи при fastcall соглашении используется 3 регистра, в порядке аргументов - eax, edx, ecx. Последующие аргументы кладутся в стек слева направо. В инке просто в первый аргумент всегда передается контекст - тот самый пресловутый eventID.
    В msvc только первые два аргумента передаются в регистрах ecx, edx. Остальные аргументы передаются в стеке справа налево.
     
    L-e-o-N нравится это.

Поделиться этой страницей