正如官方文件(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 32bit上正常工作,但它在Windows 7 64bit上不起作用,因为它总是返回“未调试”。
你知道为什么会这样吗? 谢谢。