У меня сложная проблема, которую нужно решить, потому что я застрял и не нашел способа ее решить.
Вот код
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, как показано выше.
Теперь, как я могу преобразовать указатель кучи пустоты в объект типа стека. Каким-то образом, если я получу адрес аргумента a_myStruct
, равный foo
, я могу указать void*
на это место, но, опять же, я не могу разыменовать void*
, чтобы он был преобразован в объект типа MyStruct
.
Есть ли другой способ решить проблему? Как и в C ++, мы можем определить тип во время выполнения.
У меня проблема с вызовом функций во время выполнения в C ++, которые могут иметь сигнатуру с полными пользовательскими типами, которые неизвестны во время компиляции. Но детали этих типов мне доступны (поскольку я расшифровал детали определенного типа) из библиотеки типов или из DIA SDK). Но главная проблема в том, что теперь я хочу вызывать эти функции во время выполнения. Во время компиляции у меня просто есть адрес функции и детали определенного пользователем типа, какой объект или указатель участвует в качестве аргумента этой сигнатуры функции. Теперь, если я хочу вызвать эту функцию во время выполнения, мне нужно сначала заполнить этот тип во время выполнения, создав временный блок в куче и заполнив этот блок данными. У меня есть все детали этого типа.
Теперь проблема в том, что я не знаю, что функция принимает аргумент в качестве указателя того типа, о котором у меня есть доступные данные, или этот аргумент является точно стековым объектом этого типа. Если у меня есть указатель на этот тип, нет проблем, но если есть объект, у меня есть большая проблема, чтобы вызвать эту функцию во время выполнения.