Я опять о своем. Пусть у меня есть void* ааа. Я знаю что это указатель на функцию. В тантайме я узнаю все про агрументы и возвращемое значение. Можно ли как-то запихать в стек ручккми все нужные агрументы, вызвать функцию без аргуметров, и потом снять руками со стека результат? То есть хочется вот такого хака:
Здравствуйте, Misha87, Вы писали:
M>Я опять о своем. Пусть у меня есть void* ааа. Я знаю что это указатель на функцию. В тантайме я узнаю все про агрументы и возвращемое значение. Можно ли как-то запихать в стек ручккми все нужные агрументы, вызвать функцию без аргуметров, и потом снять руками со стека результат? То есть хочется вот такого хака:
M>
Я почему бы просто не передавать в функции массив каких-нибудь вариантов?
Реализацию функций у тебя пишут специально для регистрации в машине?
Re: Можно ли вызвать функцию, запихав аргументы в стек рукам
От:
Аноним
Дата:
24.12.08 21:51
Оценка:
Можно то можно, но это очень платформозависимый хак. Например на х64 платформе вобще первые 4 аргумента передаются через регистры, а стек надо по особому выравнивать.
А чем не угодили старые добрые три точки в аргументах?
Re: Можно ли вызвать функцию, запихав аргументы в стек рукам
Ничего мне никто не посоветовал сделать так, как было задумано в самом начальном вопросе — чтобы пользователю ввоще не было видно никаких шаблонов. Все советы свелись к запрятыванию этих же шаблонов в макросы. То есть как сделать регитсрацию вот в таком виде:
bool RegCallback("int MyFunction(int aa=0, float bb=0.0, int cc=1)", void* funcPtr)
никто такого решения не предложил. Извраты с шаблонами, умными указателями и прочими, так что эту всю кухню видит пользователь, у меня сейчас уже сделана и работает — я хочу сделать именно так как в приведенном примере
Re[2]: Можно ли вызвать функцию, запихав аргументы в стек ру
Ничего мне никто не посоветовал сделать так, как было задумано в самом начальном вопросе — чтобы пользователю ввоще не было видно никаких шаблонов. Все советы свелись к запрятыванию этих же шаблонов в макросы. То есть как сделать регитсрацию вот в таком виде:
bool RegCallback("int MyFunction(int aa=0, float bb=0.0, int cc=1)", void* funcPtr)
никто такого решения не предложил. Извраты с шаблонами, умными указателями и прочими, так что эту всю кухню видит пользователь, у меня сейчас уже сделана и работает — я хочу сделать именно так как в приведенном примере
Re[2]: Можно ли вызвать функцию, запихав аргументы в стек ру
O, суперско. А для других типов кроме целого что-нибудь придумалось?
AM>Я почему бы просто не передавать в функции массив каких-нибудь вариантов?
Не, хочется чтобы просто у пользовтаеля есть его обычная функция с обычными парамтерами и он одной строкой мог зарегистрить её в скриптовыую машину. Пути через зад со всякими шаблона, вариантами, стеками, машинами состоняий и прочее не хочется. Точнее не хочется чтобы это все видел пользовтаель, или тем боллее как-то эта кухня влияла на способ написания колбеков.
AM>Реализацию функций у тебя пишут специально для регистрации в машине?
Да
Re[3]: Можно ли вызвать функцию, запихав аргументы в стек ру
Здравствуйте, Misha87, Вы писали:
M>Ничего мне никто не посоветовал сделать так, как было задумано в самом начальном вопросе — чтобы пользователю ввоще не было видно никаких шаблонов. Все советы свелись к запрятыванию этих же шаблонов в макросы. То есть как сделать регитсрацию вот в таком виде:
M>
M>никто такого решения не предложил. Извраты с шаблонами, умными указателями и прочими, так что эту всю кухню видит пользователь, у меня сейчас уже сделана и работает — я хочу сделать именно так как в приведенном примере
Посмотри в исходники AngelScript — это интерпретатор, в котором можно регистрировать сишные и сиплюсплюсные функции практически так, как тебе надо.
Выглядит примерно так:
void Func(int a, float b);
r = engine->RegisterGlobalFunction("void Func(int, float)", asFUNCTION(globalFunc), asCALL_CDECL);
Re: Можно ли вызвать функцию, запихав аргументы в стек рукам
Здравствуйте, Misha87, Вы писали:
M>Я опять о своем. Пусть у меня есть void* ааа. Я знаю что это указатель на функцию. В тантайме я узнаю все про агрументы и возвращемое значение. Можно ли как-то запихать в стек ручккми все нужные агрументы, вызвать функцию без аргуметров, и потом снять руками со стека результат? То есть хочется вот такого хака:
Можно посмотреть исходники плагина System к NSIS. Там как раз делается это же, вызов внешней функции из интерпретатора, параметры задаются строкой, довольно мощный синтаксис (работа со структурами, памятью, СОМ-интерфейсами).
Re[3]: Можно ли вызвать функцию, запихав аргументы в стек ру
Здравствуйте, Misha87, Вы писали:
M>ПРосто я что-то никак не могу разобраться как эту libffi под MSVC скомпилить
Читаем внимательней, там ниже nen777w тоже спросил о том как построить.
Вообщем, тебе лучше поглядеть на http://www.nongnu.org/cinvoke/ там есть проект под vs.
Re[6]: Можно ли вызвать функцию, запихав аргументы в стек ру
Спасибо большое.
Слуш, а откуда ты все такие либы тянешь? Помнится в другом топике про OpenGL GUI ты тоже какого-то зверя порекомендовал. Ты как ишешь такое?
Re[7]: Можно ли вызвать функцию, запихав аргументы в стек ру
Здравствуйте, Misha87, Вы писали:
M>Спасибо большое. M>Слуш, а откуда ты все такие либы тянешь? Помнится в другом топике про OpenGL GUI ты тоже какого-то зверя порекомендовал. Ты как ишешь такое?
гугл начало всех начал. Могу например целый день копаться в том что он там мне выдает по моим запросам.
Перечитать\пересмотреть кучу всякого хлама, сотни переходов по ссылкам, что бы найти то что надо. Вот так все и находится.
Re: Можно ли вызвать функцию, запихав аргументы в стек рукам
Я вот тут написал своё на базе исходников AngelScript. Все работает, все суперю. Но думаю — баги будут если на 64 надо будет перейти. А в эти либы работа с x64 уже встароена?
Re[2]: Можно ли вызвать функцию, запихав аргументы в стек ру
Здравствуйте, <Аноним>, Вы писали:
А>Можно то можно, но это очень платформозависимый хак.
Платформозависимость здесь только в том, что void* <-> void(void), что не для всех моделей памяти справедливо.
Впрочем, последний раз я такое разделение видел под дос.
А>Например на х64 платформе вобще первые 4 аргумента передаются через регистры, а стек надо по особому выравнивать.
Если конвенция __cdecl, то там все аргументы передаются через стек. Иначе это уже не __cdecl, а компиляторно-зависимый __fastcall.
А>А чем не угодили старые добрые три точки в аргументах?