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)
谢谢
您遇到的问题很容易解释。如果您使用 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 中运行您的程序,但您将无法使用hExclusiveRoot和hExclusiveTrustedPeople成员。原因是cbSize您应该初始化为 的字段sizeof(CERT_CHAIN_ENGINE_CONFIG)。它为CertCreateCertificateChainEngine函数提供了有关输入结构大小的足够信息CERT_CHAIN_ENGINE_CONFIG。如果 的值较小cbSize,则最后的HCERTSTORE成员hExclusiveRoot和hExclusiveTrustedPeople将不被使用。
| 归档时间: |
|
| 查看次数: |
1747 次 |
| 最近记录: |