14

我的项目出现了一些致命错误,错误来自 sspi.h,我必须定义一些东西,但我不是什么以及为什么,请有人解释一下。

sspi.h(60): fatal error C1189: #error :   You must define one of SECURITY_WIN32, SECURITY_KERNEL, or SECURITY_MAC
4

3 回答 3

19

虽然诊断很清楚必须定义、 或之一SECURITY_WIN32,但它对确定使用哪个以及为什么使用没有多大帮助。据我所知,这些都没有正式记录在 MSDN 中,因此唯一的信息来源是实际的头文件。SECURITY_KERNELSECURITY_MAC

  • SECURITY_MAC: 这个符号只出现在<sspi.h>中,该文件的版权声明为1992-1999. 据推测,这个符号是为了支持“经典​​”Mac OS 的编译而引入的,早在 MFC 仍计划成为面向 Windows 和 Mac 的跨平台框架时。这个符号今天似乎没有任何实际用途。

  • SECURITY_KERNEL:这里最有启发性的评论来自<NTSecPKG.h>,阅读// Can't use the windows.h def'ns in kernel mode.。这似乎表明在SECURITY_KERNEL从以内核模式运行的模块访问安全包时需要定义该符号。

  • SECURITY_WIN32: 在整个 Windows SDK 中根本没有关于这个符号的注释。从用户模式应用程序访问安全 API 时应该使用这个符号似乎是合理的。

假设以上所有内容都是正确的,可以使用以下准则来确定要定义的符号:

  • SECURITY_WIN32在编译用户模式应用程序时定义。
  • SECURITY_KERNEL在编译内核模式模块时定义。
  • 永远不要定义过时的SECURITY_MAC预处理器符号。
于 2017-10-20T08:22:24.580 回答
5

Just add

#define SECURITY_WIN32 

before all includes

于 2012-07-19T13:32:30.200 回答
0

只是为了添加到现有答案,定义它的更好方法是

#ifndef SECURITY_WIN32 
#define SECURITY_WIN32 
#endif

您可以在#include 有问题的头文件之前添加它,或者在第一次调用 windows.h 或 afxwin.h 或其他任何东西之前将它添加到您的 stdafx.h(如果您正在使用)全局添加它指出您定义了 WINVER 和 _WIN32_WINNT,或者您当然可以将其添加到您的项目设置中。

于 2020-01-12T18:14:05.157 回答