立ち往生していて、これを解決する方法がまったく見つからないため、解決すべき複雑な問題があります。これがコードです
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から)。しかし、主な問題は、実行時にこれらの関数を呼び出したいということです。コンパイル時に、関数のアドレスと、その関数シグネチャの引数として参加しているオブジェクトまたはポインターのユーザー定義型の詳細を取得します。実行時にその関数を呼び出したい場合は、最初にヒープに一時ブロックを作成し、そのブロックにデータを入力して、実行時にその型を設定する必要があります。その型のすべての詳細があります。
ここでの問題は、関数が引数をその型のポインターとして使用できるかどうか、またはその引数が正確にその型のスタックオブジェクトであるかどうかがわからないことです。その型へのポインタがあれば問題ありませんが、そこにオブジェクトがある場合、実行時にその関数を呼び出すのに大きな問題があります。