gpt4 book ai didi

c++ - 如何在不包含 Windows.h 的情况下获取 IsDebuggerPresent 的声明?

转载 作者:可可西里 更新时间:2023-11-01 10:42:35 31 4
gpt4 key购买 nike

这与 How to install a DebugBreak handler? 有关和 How to get a declaration for DebugBreak without including Windows.h? .我们想使用 IsDebuggerPresent() 进行评估避免使用 DebugBreak() 时崩溃没有调试器。

我们遇到的问题是,我们必须包括 <windows.h> , 它带来了很多额外的麻烦,即使是 WIN32_LEAN_AND_MEAN定义。一些多余的东西,比如 minmax , 中断 C++ 编译。事实上,测试我们的改变让我们崩溃了。

尝试用一个简单的 extern BOOL IsDebuggerPresent() 来做到这一点需要大量的预处理器魔法,并且不匹配函数所有版本的签名。考虑到我们希望确保 15 年的操作系统和编译器“一切正常”,这似乎是一个棘手的问题。

是否可以使用 IsDebuggerPresent()不包括 <windows.h> ?如果是这样,那我们该怎么做呢?

最佳答案

下面的代码是 Windows 的运行时调试器,它在不包括 windows.h 本身的情况下发挥最低限度的作用。我知道这并不能直接回答问题,但是为了使代码正常工作,您需要专门定义的是体系结构定义(预处理器的东西),以及 <errhandlingapi.h> , 和 <windef.h> .我不完全确定还有什么,所以请引用下面的示例:

我的代码:

#if !defined(_68K_) && !defined(_MPPC_) && !defined(_X86_) && !defined(_IA64_) && !defined(_AMD64_) && !defined(_ARM_) && !defined(_ARM64_) && defined(_M_IX86)
#define _X86_
#if !defined(_CHPE_X86_ARM64_) && defined(_M_HYBRID)
#define _CHPE_X86_ARM64_
#endif
#endif

#if !defined(_68K_) && !defined(_MPPC_) && !defined(_X86_) && !defined(_IA64_) && !defined(_AMD64_) && !defined(_ARM_) && !defined(_ARM64_) && defined(_M_AMD64)
#define _AMD64_
#endif

#if !defined(_68K_) && !defined(_MPPC_) && !defined(_X86_) && !defined(_IA64_) && !defined(_AMD64_) && !defined(_ARM_) && !defined(_ARM64_) && defined(_M_ARM)
#define _ARM_
#endif

#if !defined(_68K_) && !defined(_MPPC_) && !defined(_X86_) && !defined(_IA64_) && !defined(_AMD64_) && !defined(_ARM_) && !defined(_ARM64_) && defined(_M_ARM64)
#define _ARM64_
#endif

#if !defined(_68K_) && !defined(_MPPC_) && !defined(_X86_) && !defined(_IA64_) && !defined(_AMD64_) && !defined(_ARM_) && !defined(_ARM64_) && defined(_M_M68K)
#define _68K_
#endif

#if !defined(_68K_) && !defined(_MPPC_) && !defined(_X86_) && !defined(_IA64_) && !defined(_AMD64_) && !defined(_ARM_) && !defined(_ARM64_) && defined(_M_MPPC)
#define _MPPC_
#endif

#if !defined(_68K_) && !defined(_MPPC_) && !defined(_X86_) && !defined(_M_IX86) && !defined(_AMD64_) && !defined(_ARM_) && !defined(_ARM64_) && defined(_M_IA64)
#if !defined(_IA64_)
#define _IA64_
#endif /* !_IA64_ */
#endif

#ifndef _MAC
#if defined(_68K_) || defined(_MPPC_)
#define _MAC
#endif
#endif
#include <string>
#include <windef.h>
#include <WinUser.h>
#include <WinNls.h>
#include <errhandlingapi.h>
#include <processthreadsapi.h>
#include <WinBase.h>

__pragma (comment(lib, "User32"));

namespace Microsoft {
void __stdcall rt_assert(const bool test, const wchar_t* FunctionName)
{
if (test) return;

// Retrieve the system error message for the last-error code
unsigned __int32 ERROR_ID = GetLastError();
void* MsgBuffer;
LCID lcid; //language id
GetLocaleInfoEx(L"en-US", LOCALE_RETURN_NUMBER | LOCALE_ILANGUAGE, (wchar_t*)&lcid, sizeof(lcid));

//get error message and attach it to Msgbuffer
FormatMessageW(
FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS,
NULL, ERROR_ID, lcid, (wchar_t*)&MsgBuffer, 0, NULL);

//concatonate string to DisplayBuffer
const std::wstring DisplayBuffer = (static_cast<std::wstring>(FunctionName) + L" failed with error " + std::to_wstring(ERROR_ID) + L": " + static_cast<const wchar_t*>(MsgBuffer)).c_str();

// Display the error message and exit the process
if (IsDebuggerPresent())
{
OutputDebugStringW(DisplayBuffer.c_str());
}
else
{
MessageBoxExW(NULL, DisplayBuffer.c_str(), L"Error", MB_ICONERROR | MB_OK, static_cast<unsigned __int16>(lcid));
}
ExitProcess(ERROR_ID);
}
}

关于c++ - 如何在不包含 Windows.h 的情况下获取 IsDebuggerPresent 的声明?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44232758/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com