プロジェクトで致命的なエラーが発生しました。エラーはsspi.hから発生しています。何かを定義する必要がありますが、私は何を、なぜかはわかりません。誰かに説明してください。
sspi.h(60): fatal error C1189: #error : You must define one of SECURITY_WIN32, SECURITY_KERNEL, or SECURITY_MAC
プロジェクトで致命的なエラーが発生しました。エラーはsspi.hから発生しています。何かを定義する必要がありますが、私は何を、なぜかはわかりません。誰かに説明してください。
sspi.h(60): fatal error C1189: #error : You must define one of SECURITY_WIN32, SECURITY_KERNEL, or SECURITY_MAC
診断では、、、、またはのいずれかを定義する必要があることは明らかですがSECURITY_WIN32
、どちらを使用するか、およびその理由を決定するのにはあまり役立ちません。私の知る限り、これらはいずれもMSDNに正式に文書化されていないため、情報源は実際のヘッダーファイルのみです。SECURITY_KERNEL
SECURITY_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
廃止されたプリプロセッサシンボルは絶対に定義しないでください。追加するだけ
#define SECURITY_WIN32
すべてが含まれる前に
既存の回答に追加するだけで、それを定義するための好ましい方法は次のようになります。
#ifndef SECURITY_WIN32
#define SECURITY_WIN32
#endif
これは、問題のあるヘッダーファイルを#includeする直前に追加することも、windows.hやafxwin.hなどを最初に呼び出す前にstdafx.h(使用している場合)をグローバルに追加することもできます。 WINVERと_WIN32_WINNTを定義するか、もちろんプロジェクト設定に追加することもできます。