【问题标题】:How to get pointer to first arg of function?如何获取指向函数第一个参数的指针?
【发布时间】:2017-06-11 16:49:26
【问题描述】:

我想用相同的参数反射调用函数而不手动处理参数(将来这将是宏,这将是自动的)。

UFUNCTION()
void PleaseRespawnMe(FName className)
{
    uint64 _frame;  // Here is stack pointer?

    UFunction* func = GetController()->ServerCheatManager->FindFunction("PleaseRespawnMe");  // function with same name
    void* startStack = (void*)(&_frame - func->ParmsSize);  // Start stack is pointer to first variable minus params size?
    GetController()->ServerCheatManager->ProcessEvent(func, startStack);  // calling using pointer of first argument
}

但是&_frame 指针离&className 太远了。有没有使用局部变量地址获取args指针的解决方案?

附:这是 Unreal Engine 4 框架(通过名称调用函数是虚幻反射系统)。

【问题讨论】:

  • without manually coping params 改为传递引用怎么样?
  • @SingerOfTheFall 但是如何在代码中不使用此参数名称的情况下获取参考?在未来的宏中,我需要减少对参数的任何直接处理。

标签: c++ memory reflection stack unreal-engine4


【解决方案1】:

我通过搜索FindFunction(检查了代码,发现了这个:for (TFieldIterator<UProperty>,我想这就是你想要的。

我用我的UFUNCTION 对其进行了测试,迭代器通过输入参数运行然后返回值。

我建议搜索for (TFieldIterator<UProperty>for (TFieldIterator<UProperty> It(Function); 以查看用例,并注意属性标志,这有助于过滤您正在寻找的特定属性。

【讨论】:

  • 它是函数参数(UProperties)的反射数据,它不包含任何传入该函数参数的电流的实际数据。我需要获取函数参数地址(开始),例如省略号(... - void func(uint8 param, ...);)可以通过参数列表中前一个变量的地址来获取。
  • 那么void* startStack 是函数的第一个参数吗?我不太确定您要传递给UFunction* func 的参数是哪一个。
  • 我找到了一个示例函数static void Call(UObject* Target, const TCHAR* FunctionName, void* Args = nullptr),这是你想要做的吗?
  • UObject::ProcessEvent(UFunction* Func, void* Parms); 在某些情况下调用UFUNCTIONParms - 是指向内存中第一个参数的指针。例如,我可以创建struct { int32 parm1 = 0; FString parm2 = "Hi" } data; 并调用ProcessEvent(func, &data);。所以。函数 args 具有相同的内存表示。同样使用也很好。还是我错了?
猜你喜欢
  • 2016-11-28
  • 2022-12-01
  • 2019-04-20
  • 1970-01-01
  • 1970-01-01
  • 2016-10-09
  • 2018-04-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多