関数アドレス(マップファイルから読み取る)と引数を、ソケットからの引数としてコンマ区切りのデータとして受け入れる汎用テスト関数を作成しています。
既知の関数ポインターに実装できます。
お気に入り
void iif(int a, int b, float f);
typedef void (*fn_t)(int a, int b, float f);
上記のアプローチでは、コードベースにすべてのタイプの関数実装用の関数ポインターを記述します。これを行う一般的な方法はありますか?
関数アドレス(マップファイルから読み取る)と引数を、ソケットからの引数としてコンマ区切りのデータとして受け入れる汎用テスト関数を作成しています。
既知の関数ポインターに実装できます。
お気に入り
void iif(int a, int b, float f);
typedef void (*fn_t)(int a, int b, float f);
上記のアプローチでは、コードベースにすべてのタイプの関数実装用の関数ポインターを記述します。これを行う一般的な方法はありますか?
いいえ、コンパイラは引数を表す方法を知る必要があるためです。情報を除外する関数ポインタ型の場合はそれを知ることができないため、呼び出しを生成できません。
パラメータの数が少ない関数は、CPUレジスタでそれらを渡す可能性があります。たとえば、多くのパラメータが呼び出されると、スタックに「スピルオーバー」します。
varargsを使用してこれを回避できます。これにより、引数が渡される方法が本質的に「ロックダウン」されます。もちろん、呼び出された関数にvarargsの処理を強制しますが、これはあまり便利ではありません。
次のことができます。
fn_t fncptr;
fncptr= MapAddress + 0x(offset);
MapAdressは、ファイルをメモリアドレスにマップする場所です。(C ++コンパイラがvoidへのオフセットの追加に失敗した場合は、以前にDWORDにキャストできます)オフセットは、ファイル内の関数コードの場所です。ただし、覚えておいてください。WindowsのポインタへのexetuceアドレスはPAGE_EXETUCE_READWRITEです。次に、次のように呼び出します、
fncptr(arg1, arg2, arg3);
コンパイラが最初のコードで失敗した場合は、次のようにします。fn_t fncptr; fncptr =(fn_t)((DWORD)MapAddress + 0x(offset));