-1

私はMicrosoftのDetoursを使ってAPIをフックしています。たとえば、次のようにMessageBoxA 呼び出されたときに何が起こるかを変更できます。

  int (WINAPI* pMessageBoxA)(HWND, LPCTSTR, LPCTSTR, UINT) = MessageBoxA;

  int WINAPI MyMessageBoxA(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType)
  {
      printf("A function is called here!\n");
      return pMessageBoxA(hWnd, lpText, lpCaption, uType);  // call the regular MessageBoxA
  }

  DetourTransactionBegin();
  DetourUpdateThread(GetCurrentThread());
  DetourAttach(&(PVOID&)pMessageBoxA, MyMessageBoxA); 

したがって、を呼び出すときMessageBoxAは、実際にを呼び出していMyMessageBoxAます。ここで、実行時に上記のコードが実行することを実行
する関数を作成します。Hook()たとえば、関数ポインタMessageBoxAを関数に渡すと、上記のコードとまったく同じように動作します。
もちろん、他の関数ポインタを渡すこともできます。
次に、で関数ポインターを取得するときに、指定された関数(この場合はto )とHook同じ戻り値とパラメーターを使用して関数を定義し、関数の関数本体を埋めるにはどうすればよいですか?MessageBoxAint WINAPI MyMessageBoxA(HWND hWnd, LPCTSTR lpText, LPCTSTR lpCaption, UINT uType)

4

2 に答える 2

1

C ++では、関数はファーストクラスのオブジェクトではありません。つまり、実行時に作成することはできません。

ただし、関数ポインターの配列を使用できます。各ポインターは既に定義された関数を指し、いくつかの条件に基づいて実行時に適切な関数ポインターを選択し、それを呼び出すことができます。また、コードスニペットですでに関数ポインタを使用しているようです。

于 2011-04-16T14:33:36.470 に答える
0

これは完全に真実ではありません。(メンバー)関数参照を簡単に格納できるため、関数に別の関数(実行時に決定可能)を呼び出させることができます。

functor()演算子をolverloadingする構造体/クラスであるaを使用することもできます。次に、クラスの状態を使用して、呼び出す実際の関数を記憶できます。ファンクターの例:

STLには、<functional>(メンバー)関数参照の処理を「簡単に」(わずかに)するための便利なユーティリティが多数含まれているヘッダーがあります。cplusplus.comからのランダムな例:

// mem_fun example
#include <iostream>
#include <functional>
#include <vector>
#include <algorithm>
#include <string>
using namespace std;

int main () 
{
  vector <string*> numbers;

  // populate vector of pointers:
  numbers.push_back ( new string ("one") );
  numbers.push_back ( new string ("two") );
  numbers.push_back ( new string ("three") );
  numbers.push_back ( new string ("four") );
  numbers.push_back ( new string ("five") );

  vector <int> lengths ( numbers.size() );

  transform (numbers.begin(), numbers.end(), lengths.begin(), mem_fun(&string::length));

  for (int i=0; i<5; i++) {
      cout << *numbers[i] << " has " << lengths[i] << " letters.\n";
  }
  return 0;
}

c ++ 0xには、これを簡単にする多くの気の利いた新機能('auto'型推論やラムダ式を含む)があります。

于 2011-04-16T14:46:28.960 に答える