如何解决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
相关产品推荐
相关产品推荐

