/Gh (_penter フック関数の有効化)
各メソッドまたは関数の先頭で _penter
関数を呼び出します。
構文
/Gh
解説
_penter
関数はどのライブラリにも含まれていません。 ユーザーが _penter
の定義を指定する必要があります。
_penter
を明示的に呼び出す予定がない限り、プロトタイプを提供する必要はありません。 関数では、開始時にすべてのレジスタの内容をプッシュし、終了時に変更されていないコンテンツをポップする必要があります。 次のプロトタイプと同じようになる必要があります。
void __declspec(naked) __cdecl _penter( void );
この宣言は、64 ビットのプロジェクトでは使用できません。
Visual Studio 開発環境でこのコンパイラ オプションを設定するには
プロジェクトの [プロパティ ページ] ダイアログ ボックスを開きます。 詳細については、Visual Studio での C++ コンパイラとビルド プロパティの設定に関する記事を参照してください。
[構成プロパティ]>[C/C++]>[コマンド ライン] プロパティ ページを選択します。
[追加のオプション] ボックスにコンパイラ オプションを入力します。
このコンパイラ オプションをコードから設定するには
- 以下を参照してください。AdditionalOptions
例
次のコードは、/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
関数は main
と x
のエントリで呼び出されます。
In a function!
In a function!
関連項目
MSVC コンパイラ オプション
MSVC コンパイラのコマンド ライン構文
/GH
(_pexit フック関数の有効化)