Руководство
Подробное руководство по эффективному использованию плагина, которое поможет вам максимально использовать его возможности и функциональность.
Динамический вызов C/C++ функций на любом языке
Это плагин, который обеспечивает динамический вызов C-функций во время выполнения. Это особенно полезно, когда сигнатуры функций неизвестны во время компиляции, например, при взаимодействии с плагинами, внешними библиотеками или скриптовыми системами. Он основан на мощной библиотеке dyncall и разработан для легкой интеграции в ваш плагин или скриптовую среду.
Это руководство охватывает:
- Инициализацию виртуальной машины вызовов
- Настройку вызова функции
- Передачу аргументов
- Вызов функции
- Обработку возвращаемых значений
Пошаговый пример
Предположим, вы хотите динамически вызвать эту функцию:
1. Получение указателя на функцию
На практике это может быть получено из разделяемой библиотеки или плагина:
2. Создание виртуальной машины вызовов
Вам нужно выделить DCCallVM и установить соглашение о вызовах:
3. Передача аргументов
Передавайте аргументы в правильном порядке, используя типо-специфичные функции dyncall::Arg*:
4. Вызов функции
Вызовите функцию, используя правильный вариант dyncall::Call*:
Другие типы аргументов
Вот сводка того, как передавать различные типы аргументов:
| Тип C | Функция передачи | Функция вызова |
|---|---|---|
int | dyncall::ArgInt(vm, x) | dyncall::CallInt(...) |
long | dyncall::ArgLong(vm,x) | dyncall::CallLong(...) |
float | dyncall::ArgFloat(...) | dyncall::CallFloat(...) |
double | dyncall::ArgDouble(...) | dyncall::CallDouble(...) |
void* | dyncall::ArgPointer(...) | dyncall::CallPointer(...) |
char* | dyncall::ArgString(...) | dyncall::CallString(...) |
Очистка
Освободите виртуальную машину вызовов после использования:
Расширенное: Вызов из низкоуровневого языка
Предположим, функция такая:
Тогда динамический вызов будет:
Расширенное: Вызов из высокоуровневого языка
Предположим, функция такая:
Тогда динамический вызов будет:
Пример взят отсюда
Формат сигнатуры (используется в dyncallback, dynload)
Строки сигнатур следуют этому формату (из dyncall_signature.h):
- Префикс типа возврата + упорядоченные типы аргументов
- Пример:
"ifp"= возвращаетint, принимаетfloatиvoid*
| Код | Тип |
|---|---|
v | void |
i | int |
l | long |
f | float |
d | double |
p | pointer |
s | string |
Примечания и безопасность
- Порядок аргументов имеет значение: они должны точно соответствовать сигнатуре функции.
- Если функция использует
stdcall,fastcallили другие, установитеdyncall::Mode()соответственно (например,dyncall::Mode::StdCall). - Используйте
dyncall::Reset()перед каждым вызовом для повторного использования VM. - Поведение не определено, если передан неправильный тип.
Минимальный полный пример
Смотрите также
- dyncall GitHub
- Полная документация API
man dyncall