公式ドキュメント ( closehandle API description ) に記載されているとおりです。
アプリケーションがデバッガーで実行されている場合、関数が無効なハンドル値または疑似ハンドル値を受け取ると、関数は例外をスローします。
このため、次のコードを使用して、プログラムがデバッグされているかどうかを検出できます (ハンドル 0x1 は常に無効であるため)。
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
#include <string>
int _tmain(int argc, _TCHAR* argv[]){
bool flag = false;
__try {
CloseHandle((HANDLE)0x1);
}
__except (EXCEPTION_EXECUTE_HANDLER) {
flag = true;
}
if (flag == false){
printf("Not debugged\n");
}else{
printf("Debugged\n");
}
}
Visual Studio 2008 を使用してこのコードをコンパイルし、32 ビット バイナリを作成しました。
Windows XP および Windows 7 32 ビットでは正しく動作しますが、Windows 7 64 ビットでは常に「デバッグされていません」と返されるため、動作しません。
なぜこれが起こるのか分かりますか?ありがとうございました。