在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_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
CERT_CHAIN_ENGINE_CONFIG
中没有相关结构C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\WinCrypt.h
的上述两个成员但我的2010视觉工作室项目会自动从C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include\WinCrypt.h
中提取标题和lib文件因为冲突结构,我得到parameter is incorrect
请告知我如何解决这个问题?
我是否必须安装visual studio 2010 sp1?
我found one reference in the web表示初始化结构会解决问题,但不会,因为有问题的两个参数不会显示为灰色,并会在构建时被采用。
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
更新2: 我的预处理器定义是
WIN32;_DEBUG;_WINDOWS;_USRDLL;MY_DLL_EXPORTS;%(PreprocessorDefinitions)
%(PreprocessorDefinitions)继承了如下值
_WINDLL
_MBCS
由于
答案 0 :(得分:4)
NTDDI_WIN7的值,在我的情况下是不正确的,因为我的是XP SP3机器。
据我了解,变量是根据您定位的系统初始化的,而不是您编写代码的系统。因此,您需要查看项目设置,看看您的目标平台是什么,引用了哪些标题等。
答案 1 :(得分:4)
您所遇到的问题可以很容易解释。如果使用v7.0A或v7.1,则可以编译项目,使其在Windows 7下运行。因此_WIN32_WINNT
的默认值为0x0601
。
如果你想编译程序以便它可以在Windows XP上运行,你可以define WINVER and _WIN32_WINNT explicitly。通常,可以在预处理器定义内的Visual Studio项目的设置中执行此操作。如果您这样做,CERT_CHAIN_ENGINE_CONFIG
结构的相应部分将显示为您想要的灰色。
在大多数情况下,在CERT_CHAIN_ENGINE_CONFIG
的情况下,并不是真的需要它。 Windows API主要是这样设计的,如果在Windows XP上启动程序,则在使用为Windows 7定义的CERT_CHAIN_ENGINE_CONFIG
时没有任何问题。如果你确定
#define WINVER 0x0500
#define _WIN32_WINNT 0x0500
(或0x0501
代替0x0500
)您将能够在Windows 7中运行您的程序,但您将无法使用hExclusiveRoot
和{{1成员。原因是hExclusiveTrustedPeople
字段,您应将其初始化为cbSize
。它为CertCreateCertificateChainEngine函数提供了有关输入结构sizeof(CERT_CHAIN_ENGINE_CONFIG)
大小的足够信息。如果CERT_CHAIN_ENGINE_CONFIG
值较小,则不会使用最后cbSize
个成员HCERTSTORE
和hExclusiveRoot
。