Функция-указатель в интерпретаторе - PullRequest
1 голос
/ 27 января 2012

Я строю C-интерпретатор (в C ++), который строит AST.Я хочу дать пользователю возможность общаться с реальными DLL.Например: я вызываю функцию из DLL.Эта функция ожидает указатель на функцию (на обратный вызов).Есть проблема: у меня нет реального адреса функции, потому что функция, которую я хочу дать функции DLL, существует только как узел в моем AST.Есть ли способ решить проблему?Я думал об использовании прокси-подобной функции, встроенной в мой интерпретатор, которая делегирует функции в моем AST.Проблема в том, что прокси-функция должна иметь одинаковую сигнатуру для вызова из DLL-функции ... и я не могу создавать динамические функции во время выполнения.

1 Ответ

1 голос
/ 27 января 2012

Вы не говорите конкретно, какой API / dll вы пытаетесь использовать, но большинство из них предоставляют void * (или LPVOID в окнах) «пользовательских данных», которые предоставляются вместе с обратным вызовом.указатель на функцию и будет передан в функцию обратного вызова вместе с любыми другими аргументами, подходящими для обратного вызова.

Что вы можете сделать, это передать указатель на ваш AST в качестве этого дополнительного указателя и написать небольшую оболочкуфункция для фактического обратного вызова, которая преобразует этот void * обратно в AST *, а затем вызывает вашего интерпретатора в этом AST.

...