2012-07-19 123 views
4

我在我的项目上得到了一些致命错误,错误是来自sspi.h,我必须定义一些东西,但我不是什么,为什么,请有人解释。SSPI头文件 - 致命错误

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

回答

4

只需添加

#define SECURITY_WIN32 

所有包括

+3

如果有人想提供更多细节(例如,为什么这是必要的,它做了什么/它的意思,以及另一个'SECURITY_ *'定义的意思)是否有帮助,我没有迄今为止能够找到很多信息。 – jrh 2017-05-08 19:24:30

+1

@jrh:我开始自己挖掘信息,但也是空手而归。我确实将我的发现编译成了一个答案,至少比推荐*“做这个(并祈祷)”*更完整。 – IInspectable 2017-10-20 08:27:08

2

之前虽然诊断是明确其定义的SECURITY_WIN32一个,SECURITY_KERNEL,或SECURITY_MAC,它并没有多大帮助确定哪些一个使用和为什么。据我所知,这些都没有正式记录在MSDN中,所以唯一的信息来源是实际的头文件。

  • SECURITY_MAC:此符号永远只能出现在<sspi.h>,与1992-1999版权声明的文件。据推测,这个符号是为支持编译“Classic”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预处理器符号。