/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 如何被调用两次;一次是在输入函数 main 时,一次是在输入函数 x 时。 该示例由两个单独进行编译的源文件组成。

源文件 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 挂钩函数)