如何解决如何正确解决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 头文件一起包含在一个预编译的头文件中
到目前为止我尝试过的不完美/失败的解决方案:
- 我可以在调用这些方法之前忽略这个问题或写
GetMessage
,然后它们的名称将变为#undef GetMessage
、IdxgiInfoQueue::GetMessageW
、ID3D12InfoQueue::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
...
下),然后我想这样做的原因是相应的原始方法仍然采用相同的参数,并且它们的地址在其接口的虚方法表中仍然处于相同的索引位置,这是它们在虚方法表中的索引而不是它们的名称在这里相关,所以代码在这里正常运行。但是,使用错误的名称仍然感觉不对......
- 如果我在包含 DirectX 标头之前编写
GetMessageW
,我实际调用#undef GetMessage
从窗口消息队列中检索消息的代码将是错误的,我当然可以将其从 {{1 }} 到GetMessage
但我现在有点习惯使用这些宏...
GetMessage(&Msg...)
- 我尝试在
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
扩展为 GetMessageW
或 GetMessageA
。在您的代码中相同,它在接口(DXGIInfoQueue->GetMessage
)上调用方法。因为结果名称一致。
但是,使用错误的名字仍然感觉不对......
在这里你有错误的感觉。再次 - 一切正常,无需做任何事情
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。