7

ではC:\Program Files\Microsoft SDKs\Windows\v7.0A\Include\WinCrypt.h、 の定義は次のとおりCERT_CHAIN_ENGINE_CONFIGです。

typedef struct _CERT_CHAIN_ENGINE_CONFIG {

    DWORD       cbSize;
    HCERTSTORE  hRestrictedRoot;
    HCERTSTORE  hRestrictedTrust;
    HCERTSTORE  hRestrictedOther;
    DWORD       cAdditionalStore;
    HCERTSTORE* rghAdditionalStore;
    DWORD       dwFlags;
    DWORD       dwUrlRetrievalTimeout;      // milliseconds
    DWORD       MaximumCachedCertificates;
    DWORD       CycleDetectionModulus;

*#if (NTDDI_VERSION >= NTDDI_WIN7)
    HCERTSTORE  hExclusiveRoot;
    HCERTSTORE  hExclusiveTrustedPeople;
#endif*

} CERT_CHAIN_ENGINE_CONFIG, *PCERT_CHAIN_ENGINE_CONFIG;

XP sp3 マシンで Visual Studio 2010 を使用しています。この場合、上記の構造の次の 2 つのメンバーがグレー表示されることが予想されます。しかし、これは起こっていません、

#if (NTDDI_VERSION >= NTDDI_WIN7)
    HCERTSTORE  hExclusiveRoot;
    HCERTSTORE  hExclusiveTrustedPeople;
#endif

NTDDI_VERSIONin-turn はsdkddkver.h次のように定義されており、私の場合はXP SP3マシンであるため、_WIN32_WINNTどういうわけか間違った値を取ります。NTDDI_WIN7

#if !defined(_WIN32_WINNT) && !defined(_CHICAGO_)
#define  _WIN32_WINNT   0x0601
#endif
#ifndef NTDDI_VERSION
#ifdef _WIN32_WINNT
// set NTDDI_VERSION based on _WIN32_WINNT
#define NTDDI_VERSION   NTDDI_VERSION_FROM_WIN32_WINNT(_WIN32_WINNT)
#else
#define NTDDI_VERSION   0x06010000
#endif
#endif

問題の構造の上記の 2 つのメンバーはCERT_CHAIN_ENGINE_CONFIG存在しませんが 、2010 年のビジュアル スタジオ プロジェクトは、構造が競合しているためC:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\WinCrypt.h、ヘッダー ファイルと lib ファイルを自動的に取得します。C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include\WinCrypt.hparameter is incorrect

この問題を克服する方法を教えてください。

Visual Studio 2010 SP1 をインストールする必要がありますか?

Web で、構造を初期化すると問題が解決するという1 つの参照が見つかりましたが、問題の 2 つのパラメーターはグレー表示されず、ビルド中に取り込まれるため、解決しません。

更新1:

私のプロジェクトの設定:

ここに画像の説明を入力 $(VCInstalDir) - >C:\Program Files\Microsoft Visual Studio 10.0\VC

$(WindowsSdkDir) ->C:\Program Files\Microsoft SDKs\Windows\v7.0A

$(FrameworkSdkDir) ->C:\Program Files\Microsoft SDKs\Windows\v7.0A

ライブラリファイルの設定、

$(VCInstallDir)lib
$(VCInstallDir)atlmfc\lib
$(WindowsSdkDir)lib
$(FrameworkSDKDir)\lib

更新 2: 私のプリプロセッサの定義は

WIN32;_DEBUG;_WINDOWS;_USRDLL;MY_DLL_EXPORTS;%(PreprocessorDefinitions)

%(PreprocessorDefinitions) は次のように値を継承しました

_WINDLL
_MBCS

ありがとう

4

2 に答える 2

4

私の場合はXP SP3マシンであるため、NTDDI_WIN7の値は正しくありません。

私が理解しているように、変数は、コードをコンパイルしているシステムではなく、ターゲットにしているシステムに従って初期化されます。したがって、プロジェクトの設定を見て、ターゲット プラットフォームは何か、どのヘッダーが参照されているかなどを確認する必要があります。

于 2011-06-21T18:05:15.903 に答える
4

あなたが抱えている問題は非常に簡単に説明できます。v7.0A または v7.1 を使用すると、Windows 7 で実行できるようにプロジェクトをコンパイルできます。そのため、 のデフォルト値_WIN32_WINNT0x0601.

プログラムを共同コンパイルして Windows XP で実行する場合は、WINVER と _WIN32_WINNT を明示的に定義できます。通常、プリプロセッサ定義内の Visual Studio プロジェクトの設定でこれを行います。これを行うと、CERT_CHAIN_ENGINE_CONFIG構造の対応する部分が必要に応じて灰色で表示されます。

ほとんどの場合、CERT_CHAIN_ENGINE_CONFIG実際には必要ありません。CERT_CHAIN_ENGINE_CONFIGWindows API は、Windows XP でプログラムを起動した場合に、Windows 7 用に定義された の使用に問題がないように設計されています。定義する場合

#define WINVER 0x0500
#define _WIN32_WINNT 0x0500

(または0x0501の代わりに) Windows 7 でプログラムを実行できますが、およびメンバー0x0500を使用することはできません。その理由は、として初期化する必要があるフィールドです。CertCreateCertificateChainEngine関数に、入力構造体のサイズに関する十分な情報を提供します。の値が小さい場合、最後のメンバーとは使用されません。hExclusiveRoothExclusiveTrustedPeoplecbSizesizeof(CERT_CHAIN_ENGINE_CONFIG)CERT_CHAIN_ENGINE_CONFIGcbSizeHCERTSTOREhExclusiveRoothExclusiveTrustedPeople

于 2011-07-01T14:28:42.453 に答える