VS2010 - CryptoAPI中的结构更改 - v7.0A Vs v6.0A - WinCrypt.h

Raj*_*Raj 7 c++ certificate visual-studio-2010 cryptoapi visual-c++

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;
Run Code Online (Sandbox Code Playgroud)

我在XP sp3机器中使用visual studio 2010,在这种情况下,我希望上面结构中的以下两个成员变灰.但这不会发生,

#if (NTDDI_VERSION >= NTDDI_WIN7)
    HCERTSTORE  hExclusiveRoot;
    HCERTSTORE  hExclusiveTrustedPeople;
#endif
Run Code Online (Sandbox Code Playgroud)

NTDDI_VERSION反过来定义sdkddkver.h如下,并且_WIN32_WINNT以某种方式取得NTDDI_WIN7我的情况下的值不正确,因为我的是XP SP3机器.

#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
Run Code Online (Sandbox Code Playgroud)

CERT_CHAIN_ENGINE_CONFIG问题的结构的上述两个成员不存在 C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\WinCrypt.h但是我的2010视觉工作室项目自动拉入标题和lib文件C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include\WinCrypt.h由于结构冲突,我得到了parameter is incorrect

请告诉我如何解决这个问题?

我应该安装visual studio 2010 sp1吗?

在网上找到了一个引用,它表示初始化结构将解决问题,但它不会,因为这两个参数不会显示为灰色并在构建时将被采用.

UPDATE1:

我的项目设置:

在此输入图像描述 $(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
Run Code Online (Sandbox Code Playgroud)

更新2: 我的预处理器定义是

WIN32;_DEBUG;_WINDOWS;_USRDLL;MY_DLL_EXPORTS;%(PreprocessorDefinitions)
Run Code Online (Sandbox Code Playgroud)

%(PreprocessorDefinitions)继承了如下值

_WINDLL
_MBCS
Run Code Online (Sandbox Code Playgroud)

谢谢

Ole*_*leg 4

您遇到的问题很容易解释。如果您使用 v7.0A 或 v7.1,您可以编译您的项目,以便它可以在 Windows 7 下运行。因此,默认_WIN32_WINNT值为0x0601

如果您想要共同编译该程序,以便它可以在 Windows XP 上运行,您可以显式定义 WINVER 和 _WIN32_WINNT。通常,可以在预处理器定义内的 Visual Studio 项目设置中执行此操作。如果您这样做,CERT_CHAIN_ENGINE_CONFIG结构的相应部分将按照您的需要显示为灰色。

在大多数情况下并且在CERT_CHAIN_ENGINE_CONFIG这种情况下并不是真正需要的。CERT_CHAIN_ENGINE_CONFIGWindows API 的设计主要是为了在 Windows XP 上启动程序时,使用为 Windows 7 定义的 API 不会出现任何问题。如果你定义

#define WINVER 0x0500
#define _WIN32_WINNT 0x0500
Run Code Online (Sandbox Code Playgroud)

(或0x0501代替0x0500)您将能够在 Windows 7 中运行您的程序,但您将无法使用hExclusiveRoothExclusiveTrustedPeople成员。原因是cbSize您应该初始化为 的字段sizeof(CERT_CHAIN_ENGINE_CONFIG)。它为CertCreateCertificateChainEngine函数提供了有关输入结构大小的足够信息CERT_CHAIN_ENGINE_CONFIG。如果 的值较小cbSize,则最后的HCERTSTORE成员hExclusiveRoothExclusiveTrustedPeople将不被使用。