У меня есть функция с определенным количеством параметров. Но мне нужно избегать в теле функции обращение к любому параметру:
void MyClass::MyMethod(int32 parm1, FString parm2, UObject* parm3)
{
void* firstParmPtr = ?; // как мне получить указатель? Где находится адрес первого параметра?
}
Значение указателя firstParmPtr должно быть равно &parm1.
Нашел интересный момент. Аргументы находятся в стеке, как и новые переменные. Таким образом я могу определить одну переменную в теле функции и вычесть размер всех аргументов функции (есть способ это сделать).
void MyClass::MyMethod(int32 parm1, FString parm2, UObject* parm3)
{
uint64 _framePtr;
UFunction* func = FindFunction("MyMethod");
void* firstParmPtr = &_framePtr - func->ParamsSize; // Вроде оно...
}
Однако этот вариант не работает. _framePtr слишком далеко в стеке от списка параметров. На много больше чем sizeof каждого параметра.
Тогда как мне действовать? Может нужно вычесть ещё какую-то константу?
Нужна любая информация об этом. А так же интересен адрес возвращаемого значения. А ещё желательно без использования ассемблерных вставок. Хотя можно и их, но это не главный объект интереса, так-как я не смогу такое компилировать.
this. А теперь, если можно - самый главный вопрос - зачем? Это вопрос всерьез, потому что, может, вы просто спрашиваете, как правильно держать микроскоп, чтобы забивать гвозди, а правильно было бы спросить - как гвозди забивать? Может, ваша основная задача решается как-то совсем иначе? – Harry Jan 27 '17 at 04:06void func(int a) { otherObj->func(a); }). Я могу найти функцию по её имени через__FUNCTION__и систему рефлексии (поиск метода), и я могу вызвать её используя данные в памяти через указатель как аргументы. Осталось придумать как получить указатель на эти данные. – Broly Jan 27 '17 at 08:43..., но без предшествующего параметра). – Broly Jan 27 '17 at 11:07UFunction* func = FindFunction("FuncName"); ProcessEvent(func, paramsPtr);– Broly Jan 27 '17 at 11:09