2011-06-21 25 views
7

Trong C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include\WinCrypt.h, định nghĩa cho CERT_CHAIN_ENGINE_CONFIGVS2010 - thay đổi cấu trúc trong CryptoAPI - v7.0A Vs v6.0A - WinCrypt.h

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; 

Tôi đang sử dụng Visual Studio 2010 trong một máy XP sp3, trong đó trường hợp, tôi hy vọng rằng hai thành viên sau trong cấu trúc trên được chuyển sang màu xám. Nhưng điều này không xảy ra,

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

NTDDI_VERSION trong lần lượt được định nghĩa trong sdkddkver.h như sau, và bằng cách nào đó _WIN32_WINNT mất giá trị của NTDDI_WIN7 mà trong trường hợp của tôi là không chính xác như tôi là một máy 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 

Hai thành viên trên của cấu trúc CERT_CHAIN_ENGINE_CONFIG trong câu hỏi là không có mặt trong C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\WinCrypt.h Nhưng dự án visual studio của tôi 2010 tự động kéo trong tiêu đề và các file lib từ C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include\WinCrypt.h Do cấu trúc mâu thuẫn, tôi đang nhận parameter is incorrect

Vui lòng cho biết cách tôi có thể vượt qua vấn đề này?

Tôi có nên cài đặt studio hình ảnh 2010 sp1 không?

I found one reference in the web nơi thông báo khởi tạo cấu trúc sẽ giải quyết vấn đề, nhưng sẽ không có, vì hai thông số được đề cập sẽ không bị chuyển sang màu xám và sẽ được chụp trong khi xây dựng.

UPDATE1:

Cài đặt của dự án của tôi:

enter image description here $ (VCInstalDir) -> C: \ Program Files \ Microsoft Visual Studio 10.0 \ VC

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

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

cài đặt tập tin Thư viện,

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

UPDATE 2: định nghĩa preprocessor của tôi là

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

% (PreprocessorDefinitions) kế thừa các giá trị như sau

_WINDLL 
_MBCS 

Cảm ơn

Trả lời

4

Sự cố bạn có thể giải thích rất dễ dàng. Nếu bạn sử dụng v7.0A hoặc v7.1, bạn có thể biên dịch dự án của mình để nó chạy dưới Windows 7. Vì vậy, giá trị mặc định cho _WIN32_WINNT0x0601.

Nếu bạn muốn đồng biên dịch chương trình sao cho chương trình sẽ chạy trên Windows XP, bạn có thể define WINVER and _WIN32_WINNT explicitly. Thông thường người ta làm điều này trong các thiết lập của dự án Visual Studio bên trong các định nghĩa tiền xử lý. Nếu bạn làm điều này, phần tương ứng của cấu trúc CERT_CHAIN_ENGINE_CONFIG sẽ được hiển thị màu xám như bạn muốn.

Trong hầu hết các trường hợp và trong trường hợp là CERT_CHAIN_ENGINE_CONFIG nó không thực sự cần thiết. Windows API được thiết kế chủ yếu như vậy, rằng bạn sẽ không có vấn đề gì trong việc sử dụng CERT_CHAIN_ENGINE_CONFIG được định nghĩa cho Windows 7 trong trường hợp bắt đầu chương trình trên Windows XP. Nếu bạn làm xác định

#define WINVER 0x0500 
#define _WIN32_WINNT 0x0500 

(hoặc 0x0501 thay vì 0x0500), bạn sẽ có thể chạy chương trình của bạn trong Windows 7, nhưng bạn sẽ không thể sử dụng hExclusiveRoothExclusiveTrustedPeople thành viên. Lý do là trường cbSize mà bạn nên khởi tạo là sizeof(CERT_CHAIN_ENGINE_CONFIG). Nó cung cấp cho các chức năng CertCreateCertificateChainEngine đủ thông tin về kích thước của cấu trúc đầu vào CERT_CHAIN_ENGINE_CONFIG. Trong trường hợp có giá trị nhỏ là cbSize, thì HCERTSTORE thành viên hExclusiveRoothExclusiveTrustedPeople mới nhất sẽ không được sử dụng.

4

giá trị của NTDDI_WIN7 trong trường hợp của tôi không đúng vì tôi là máy XP SP3.

Như tôi đã hiểu, các biến được khởi tạo theo hệ thống bạn đang nhắm mục tiêu, không phải hệ thống bạn đang biên dịch mã. Vì vậy, bạn cần phải xem xét cài đặt dự án của bạn và xem, nền tảng mục tiêu của bạn là gì, tiêu đề nào được tham chiếu, v.v.

+0

@Eugene, Hệ thống đích của tôi sẽ là XP, Vista, Win7, Server2003 và máy chủ 2008. Bạn có thể vui lòng xây dựng câu cuối cùng của bạn về cách định cấu hình cài đặt dự án hay không. hoặc một số gợi ý để bắt đầu? Cảm ơn – Raj

+0

@Raj bạn có mã nguồn của dự án và tôi không biết vị trí và cách định nghĩa được đặt trong dự án * của bạn *. Nếu bạn tìm kiếm "NTDDI_WIN7" trong google, liên kết đầu tiên là http://msdn.microsoft.com/en-us/library/aa383745%28v=vs.85%29.aspx, điều này có thể hữu ích cho bạn (mặc dù nó nhắm vào nhiệm vụ ngược lại với nhiệm vụ của bạn). –

+0

@Eugene. Tôi đã chỉnh sửa bài đăng gốc của mình với ảnh chụp màn hình về cài đặt dự án của tôi. Liên kết mà bạn đã hiển thị cho phép tôi xác định các chỉ thị tiền xử lý sẽ hạn chế các nền tảng đích của tôi thay vì bao gồm tất cả chúng. Có điều gì bạn có thể giới thiệu không? Cảm ơn – Raj