/Gh (_penter フック関数の有効化)

各メソッドまたは関数の先頭で _penter 関数を呼び出します。

構文

/Gh

解説

_penter 関数はどのライブラリにも含まれていません。 ユーザーが _penter の定義を指定する必要があります。

_penter を明示的に呼び出す予定がない限り、プロトタイプを提供する必要はありません。 関数では、開始時にすべてのレジスタの内容をプッシュし、終了時に変更されていないコンテンツをポップする必要があります。 次のプロトタイプと同じようになる必要があります。

void __declspec(naked) __cdecl _penter( void );

この宣言は、64 ビットのプロジェクトでは使用できません。

Visual Studio 開発環境でこのコンパイラ オプションを設定するには

  1. プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、Visual Studio での C++ コンパイラとビルド プロパティの設定に関する記事を参照してください。

  2. [構成プロパティ]>[C/C++]>[コマンド ライン] プロパティ ページを選択します。

  3. [追加のオプション] ボックスにコンパイラ オプションを入力します。

このコンパイラ オプションをコードから設定するには

次のコードは、/Gh を使用してコンパイルした場合に、_penter が 2 回呼び出される方法を示しています。関数 main に入るときに 1 回、関数 x に入るときに 1 回です。 この例は、個別にコンパイルする 2 つのソース ファイルで構成されています。

ソース ファイル local_penter.cpp:

// local_penter.cpp
// compile with: cl /EHsc /c local_penter.cpp
// processor: x86
#include <stdio.h>

extern "C" void __declspec(naked) __cdecl _penter( void ) {
   _asm {
      push eax
      push ebx
      push ecx
      push edx
      push ebp
      push edi
      push esi
    }

   printf_s("\nIn a function!");

   _asm {
      pop esi
      pop edi
      pop ebp
      pop edx
      pop ecx
      pop ebx
      pop eax
      ret
    }
}

ソース ファイル Gh_compiler_option.cpp:

// Gh_compiler_option.cpp
// compile with: cl /EHsc /Gh Gh_compiler_option.cpp local_penter.obj
// processor: x86
#include <stdio.h>

void x() {}

int main() {
   x();
}

実行すると、ローカル _penter 関数は mainx のエントリで呼び出されます。

In a function!
In a function!

関連項目

MSVC コンパイラ オプション
MSVC コンパイラのコマンド ライン構文
/GH (_pexit フック関数の有効化)