分享方式:


/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();
}

執行時,會在和 x的專案main上呼叫本機_penter函式:

In a function!
In a function!

另請參閱

MSVC 編譯器選項
MSVC 編譯器命令列語法
/GH (啟用_pexit勾點函式)