-2
typedef int(__stdcall *__MessageBoxA)(HWND, LPCSTR, LPCSTR, UINT); 

私が言ったように、C++ / アセンブリを使用してプログラムをリバース エンジニアリングする方法を学ぼうとしているので、インターネットで見つけたいくつかのオープン ソース プロジェクトを調べています。しかし、誰かがこの行が何をするのか説明できますか? 私は C++ の上級者ではありません。そのため、ソースを調べています。

4

1 に答える 1

2

あなたのコードはC言語です。したがって、C++ でも問題なくコンパイルされます。

一歩一歩進みましょう。

  1. これは関数宣言またはプロトタイプまたは署名です。
    int を返し、4 つのパラメーターを受け入れます。
int __stdcall MessageBoxA(HWND, LPCSTR, LPCSTR, UINT); 
  1. ここで ptr は関数へのポインタ変数です:
int(__stdcall *ptr)(HWND, LPCSTR, LPCSTR, UINT); 
ptr = NULL;
/ assign a correct adress
ptr = MessageBoxA;
// call the function with parameters using the pointer
(*ptr)(hWnd, NULL, NULL, 0); 
  1. ここで__MessageBoxA は、関数へのポインターである変数を定義するのに役立つ型です。
typedef int(__stdcall *__MessageBoxA)(HWND, LPCSTR, LPCSTR, UINT); 

したがって、関数変数へのポインターを宣言できます。

__MessageBoxA ptr1 = NULL;

__stdcall は、関数がコンパイラによって呼び出される方法です (パラメーターは左から右または逆に渡されますか? 戻り値はスタック メモリまたは CPU レジスタを介して渡されますか?) - 呼び出し元と呼び出された人が一致する限り、ほとんどの人は気にしません。

よろしく

于 2015-10-27T21:15:23.300 に答える