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

如何解决C语言中同时包含NTSecAPI.h与Winternl.h引发的C2371错误?

解决C语言中<Winternl.h>与<NTSecAPI.h>类型重定义问题

当同时引入这两个头文件时,UNICODE_STRING、PUNICODE_STRING等基础类型出现重复定义,本质是两个头文件对这些类型的声明路径或方式冲突,以下是C语言环境下的可行解决方法:

1. 优先引入核心基础头文件<ntdef.h>

UNICODE_STRING等类型的标准定义位于<ntdef.h>中,<Winternl.h>和<NTSecAPI.h>都会间接依赖它。手动先引入<ntdef.h>,可以让两个头文件统一使用该文件中的类型定义,避免重复声明:

#include <ntdef.h>
#include <Winternl.h>
#include <NTSecAPI.h>

2. 用预编译宏屏蔽重复定义

通过定义头文件的保护宏,让其中一个头文件跳过类型定义逻辑。不同Windows SDK版本的保护宏可能略有差异,需要查看目标头文件的开头定义:

  • 若要让<Winternl.h>跳过类型定义,可先定义_WINTERNL_宏:
#define _WINTERNL_
#include <NTSecAPI.h>
#include <Winternl.h>
  • 若要让<NTSecAPI.h>跳过类型定义,可先定义NTSecAPI_H宏:
#define NTSecAPI_H
#include <Winternl.h>
#include <NTSecAPI.h>

3. 手动声明所需函数,避免完整引入头文件

如果仅需要两个头文件中的部分功能,无需完整引入,可手动声明所需函数,依赖的基础类型从<ntdef.h>中获取:

#include <NTSecAPI.h>
#include <ntdef.h>

// 手动声明Winternl.h中需要的NtQueryInformationProcess函数
NTSTATUS NTAPI NtQueryInformationProcess(
    HANDLE ProcessHandle,
    PROCESSINFOCLASS ProcessInformationClass,
    PVOID ProcessInformation,
    ULONG ProcessInformationLength,
    PULONG ReturnLength
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 02:48:21