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,在这种情况下,我希望上述结构中的以下两个成员变灰。但这并没有发生,

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

NTDDI_VERSIONin-turn 定义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

有问题的结构的上述两个成员CERT_CHAIN_ENGINE_CONFIG不存在 C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\WinCrypt.h但我的 2010 Visual Studio 项目自动从头文件和 lib 文件中提取C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include\WinCrypt.h由于结构冲突,我得到parameter is incorrect

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

我是否必须安装 Visual Studio 2010 sp1?

在网上找到了一个参考,它说初始化结构将解决问题,但它不会,因为有问题的两个参数不会变灰,并且会在构建时被采用。

更新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

NTDDI_WIN7 的值在我的情况下是不正确的,因为我的是 XP SP3 机器。

据我了解,变量是根据您所针对的系统进行初始化的,而不是您正在编译代码的系统。所以你需要查看你的项目设置,看看你的目标平台是什么,引用了哪些头文件等。

于 2011-06-21T18:05:15.903 回答
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 定义的应用程序时不会出现问题。如果你定义

#define WINVER 0x0500
#define _WIN32_WINNT 0x0500

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

于 2011-07-01T14:28:42.453 回答