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にのみ表示されます。おそらく、このシンボルは、MFCがWindowsとMacの両方を対象とするクロスプラットフォームフレームワークであることがまだ計画されていたときに、「クラシック」MacOSのコンパイルをサポートするために導入されました。このシンボルは、今日では実用的ではないようです。

  • 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

追加するだけ

#define SECURITY_WIN32 

すべてが含まれる前に

于 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 に答える