You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:IJsonValue.GetObject方法与windows.h宏冲突问题

解决IJsonValue::GetObject()被宏替换为GetObjectW的编译错误

问题重现

代码结构如下:

#include <winrt/Windows.Data.Json.h>

#define WIN32_LEAN_AND_MEAN
#define NOMINMAX
#include <windows.h>
// windows.h 中默认定义:#define GetObject  GetObjectW

IJsonValue jsonValue = ...;
auto jsonObject = jsonValue.GetObject();

编译时触发错误:

错误 C2039: "GetObjectW": 不是"winrt::Windows::Data::Json::IJsonValue"的成员

尝试显式限定成员调用仍无效:

auto jsonObject = jsonValue.(winrt::Windows::Data::Json::IJsonValue::GetObject)();

解决思路

方法1:取消GetObject宏定义

在包含windows.h后立即取消宏替换,让后续代码中的GetObject被正确识别为WinRT接口的成员函数:

#include <winrt/Windows.Data.Json.h>

#define WIN32_LEAN_AND_MEAN
#define NOMINMAX
#include <windows.h>
#undef GetObject // 移除宏定义,避免替换WinRT成员函数名

IJsonValue jsonValue = ...;
auto jsonObject = jsonValue.GetObject();

如果后续需要调用Windows API的GetObjectW,可临时重新定义宏:

#define GetObject GetObjectW
// 执行GetObjectW相关逻辑
#undef GetObject

方法2:调整头文件包含顺序

将WinRT头文件放在windows.h之后引入,宏定义就不会影响WinRT头文件中对GetObject成员函数的声明:

#define WIN32_LEAN_AND_MEAN
#define NOMINMAX
#include <windows.h>
#include <winrt/Windows.Data.Json.h> // 后包含WinRT头文件

IJsonValue jsonValue = ...;
auto jsonObject = jsonValue.GetObject();

方法3:使用WinRT显式接口调用

通过as()方法获取显式接口实例,绕过宏替换直接调用成员函数:

IJsonValue jsonValue = ...;
auto jsonObject = jsonValue.as<winrt::Windows::Data::Json::IJsonValue>()->GetObject();

或者通过winrt::get_self获取底层接口指针(适用于复杂场景):

#include <winrt/Windows.Data.Json.h>
#include <windows.h>

IJsonValue jsonValue = ...;
auto rawPtr = winrt::get_self<winrt::impl::IJsonValue>(jsonValue);
auto jsonObject = rawPtr->GetObject();

内容的提问来源于stack exchange,提问作者Tom Huntington

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.24 04:17:43