我有一个复杂的问题要解决,因为我被卡住了,根本找不到解决这个问题的方法。这是一个代码
struct MyStruct
{
int x;
float y;
char c;
};
void foo(MyStruct a_myStruct);
int _tmain(int argc, _TCHAR* argv[])
{
void *pMyStruct = malloc(sizeof(MyStruct));
int* pInt = (int*)pMyStruct;
*pInt = 10;
pInt++;
float *pFloat = (float*)pInt;
*pFloat = 2.545;
pFloat++;
char *pChar = (char*)pFloat;
*pChar = 'c';
_asm
{
pMyStruct
call foo
}
return 0;
}
void foo(MyStruct a_myStruct)
{
}
在这里,您可以看到它foo
正在对堆栈上的对象进行操作,并且期望堆栈对象在foo
被调用时被映射。但不幸的MyStruct
是,在编译时该类型是未知的,因此我必须创建内存块,然后在运行时将数据填充到该块中,然后在foo
使用 asm 调用时传递该块,如上所示。
现在如何将堆 void 指针转换为堆栈类型对象。不知何故,如果我得到 的a_myStruct
参数的地址foo
,我可以指向void*
该位置,但我不能再次取消引用void*
,以便将其转换为MyStruct
类型的对象。
有没有其他方法可以解决问题?与在 C++ 中一样,我们也可以在运行时确定类型。
我在运行时在 C++ 中调用函数时遇到问题,该函数可能具有签名,其中包含在编译时未知的用户定义类型。但是这些类型的详细信息对我来说是可用的(因为我从类型库中破译了某些类型的详细信息或来自 DIA SDK)。但主要问题是现在我想在运行时调用这些函数。在编译时,我只有函数地址和用户定义类型的详细信息,其中对象或指针作为该函数签名的参数参与。现在,如果我想在运行时调用该函数,我需要首先在运行时通过在堆上创建临时块并用数据填充该块来填充该类型。我拥有该类型的所有详细信息。
现在的问题是我不知道该函数将参数作为我有可用详细信息的那种类型的指针,或者该参数正是该类型的堆栈对象。如果我有指向该类型的指针没问题,但如果对象存在我在运行时调用该函数有很大问题。