微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何正确解决Windows API和DirectX API以及微软开发的其他API之间的宏冲突GetMessage

如何解决如何正确解决Windows API和DirectX API以及微软开发的其他API之间的宏冲突GetMessage

问题:

我正在开发一个桌面 D3D12 应用程序,所以很自然地,我需要包含 <Windows.h><WinUser.h> 才能创建一个窗口,但是有一个 GetMessage 宏与 {{1} } 和 IdxgiInfoQueue::GetMessage(还有 ID3D12InfoQueue::GetMessage ID3D11InfoQueue::GetMessage

我在 StackOverflow 和 Github 上发现的关于这个宏的其他讨论都说应该将他们的 ID3D10InfoQueue::GetMessage 函数名称更改为其他名称,但很明显,由于我没有开发 DirectX API,因此我无法控制这...

我将 Windows API 和 DirectX API 头文件一起包含在一个预编译的头文件

到目前为止我尝试过的不完美/失败的解决方案:

  1. 我可以在调用这些方法之前忽略这个问题或写 GetMessage,然后它们的名称将变为 #undef GetMessageIdxgiInfoQueue::GetMessageWID3D12InfoQueue::GetMessageW ...
ID3D11InfoQueue::GetMessageW

起初我有点惊讶,即使名称错误,它也编译成功并且这些方法仍然可以在运行时正常调用(在名称// RenderPipeline.cpp CComPtr<IdxgiInfoQueue> dxgiInfoQueue; CComPtr<ID3D12InfoQueue> D3D12InfoQueue; ... #undef GetMessage SIZE_T Size = 0; //HRESULT result = dxgiInfoQueue->GetMessage(0,nullptr,&Size); // compile error HRESULT result = dxgiInfoQueue->GetMessageW(0,&Size); // compile success,runs ok //HRESULT result = D3D12InfoQueue->GetMessage(0,&Size); // compile error HRESULT result = D3D12InfoQueue->GetMessageW(0,runs ok ... 下),然后我想这样做的原因是相应的原始方法仍然采用相同的参数,并且它们的地址在其接口的虚方法表中仍然处于相同的索引位置,这是它们在虚方法表中的索引而不是它们的名称在这里相关,所以代码在这里正常运行。但是,使用错误名称仍然感觉不对......

  1. 如果我在包含 DirectX 标头之前编写 GetMessageW,我实际调用 #undef GetMessage 从窗口消息队列中检索消息的代码将是错误的,我当然可以将其从 {{1 }} 到 GetMessage 但我现在有点习惯使用这些宏...
GetMessage(&Msg...)
  1. 我尝试在 GetMessageW(&Msg...) 之前(以及之后的 // pch.h ... #include <Windows.h> #undef GetMessage ... // Run.cpp ... MSG Msg; //while (GetMessage(&Msg,0)) { // compile error,but I want this to work because it looks nicer while (GetMessageW(&Msg,0)) { // compile success TranslateMessage(&Msg); dispatchMessage(&Msg); } ... )的预编译头文件添加 #define NOUSER,然后在我处理的 #include <Windows.h> 中再次添加 #undef NOUSER窗口消息,但这不起作用,宏没有回来,因为在 #include <WinUser.h> 文件中有 Run.cpp #ifndef _WINUSER_ 定义阻止该文件被多次包含.. .
#define _WINUSER_

旁注:

<WinUser.h> 不是唯一产生名称冲突的宏,我记得有一个 // pch.h ... #define NOUSER #include <Windows.h> #undef NOUSER ... // Run.cpp ... #include <WinUser.h> // doesn't work... MSG Msg; //while (GetMessage(&Msg,0)) { // compile error while (GetMessageW(&Msg,0)) { // compile success TranslateMessage(&Msg); // dispatchMessage(&Msg); // compile error dispatchMessageW(&Msg); // compile success } ... 宏可以与 Media Foundation API 中的同名方法发生冲突(这个 API 也是开发的微软,当然)......我有点恼火,微软这些年没有考虑解决这些宏冲突......

编辑: 感谢大家的评论/回答,最后我接受了 Remy Lebeau 的建议,并将我的 DirectX 代码放入解决方案中的一个单独项目中(并在其 pch 标头中添加GetMessage)并且它按预期工作

解决方法

这里不需要做任何事情,您的代码中也没有任何冲突或问题。你自己已经看过了

它编译成功,这些方法仍然可以调用 正常运行时间

并且您更正了 - 不是按名称而是按虚拟表中的地址调用的方法。 winuser.h 总是包含在 IDXGIInfoQueue 声明之前,所以已经在接口声明中 GetMessage 扩展为 GetMessageWGetMessageA。在您的代码中相同,它在接口(DXGIInfoQueue->GetMessage)上调用方法。因为结果名称一致。

但是,使用错误的名字仍然感觉不对......

在这里你有错误的感觉。再次 - 一切正常,无需做任何事情

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。