2011-06-21 18 views
7

C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include\WinCrypt.h में, CERT_CHAIN_ENGINE_CONFIG के लिए परिभाषाVS2010 - v7.0A बनाम v6.0A - - CryptoAPI में संरचना परिवर्तन 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; 

मैं दृश्य स्टूडियो 2010 का उपयोग कर रहा एक XP SP3 मशीन में है, जो में है मामला, मुझे उम्मीद है कि उपर्युक्त संरचना में निम्नलिखित दो सदस्य गहरा हो जाएंगे। लेकिन इस नहीं हो रहा है,

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

NTDDI_VERSION के रूप में इस प्रकार है, और किसी भी तरह _WIN32_WINNTNTDDI_WIN7 के मूल्य के रूप में मेरा एक XP SP3 मशीन है जो मेरे मामले में सही नहीं है लेता है में बारी sdkddkver.h में परिभाषित किया गया है।

#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

हो रही है

कृपया सलाह दें कि मैं इस मुद्दे पर कैसे आ सकता हूं?

क्या मुझे विजुअल स्टूडियो 2010 SP1 इंस्टॉल करना होगा?

I found one reference in the web जहां यह कहता है कि संरचना शुरू करने से समस्या हल हो जाएगी, लेकिन ऐसा नहीं होगा, क्योंकि प्रश्न में दो पैरामीटर तैयार नहीं होंगे और इमारत के दौरान इसमें लिया जाएगा।

Update1:

अपने प्रोजेक्ट की सेटिंग्स:

enter image description here $ (VCInstalDir) -> C: \ Program Files \ Microsoft Visual Studio 10.0 \ कुलपति

$ (WindowsSdkDir) - > सी: \ प्रोग्राम फ़ाइलें \ माइक्रोसॉफ्ट एसडीके \ विंडोज \ v7.0A

$ (फ्रेमवर्क एसडीकेडीआईआर) -> सी: \ प्रोग्राम फ़ाइलें \ माइक्रोसॉफ्ट एसडीके \ विंडोज \ v7.0A

लाइब्रेरी फ़ाइल सेटिंग्स,

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

अद्यतन 2: मेरे पूर्वप्रक्रमक परिभाषाओं

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

% (PreprocessorDefinitions) मान विरासत में मिला है के रूप में इस प्रकार है

_WINDLL 
_MBCS 

धन्यवाद

हैं

उत्तर

4

आपके पास जो समस्या है वह बहुत आसान समझा जा सकता है। यदि आप v7.0A या v7.1 का उपयोग करते हैं तो आप अपनी प्रोजेक्ट को संकलित करने में सक्षम हैं ताकि यह विंडोज 7 के तहत चलाए जा सके। इसलिए _WIN32_WINNT के लिए डिफ़ॉल्ट मान 0x0601 है।

यदि आप प्रोग्राम को संकलित करना चाहते हैं तो यह विंडोज एक्सपी पर चलाएगा, आप define WINVER and _WIN32_WINNT explicitly कर सकते हैं। आम तौर पर प्रीप्रोसेसर परिभाषाओं के अंदर विजुअल स्टूडियो प्रोजेक्ट की सेटिंग्स में ऐसा होता है। यदि आप ऐसा करेंगे तो CERT_CHAIN_ENGINE_CONFIG संरचना का इसी भाग को आपके जैसा ग्रे दिखाई देगा।

ज्यादातर मामलों में और CERT_CHAIN_ENGINE_CONFIG के मामले में इसकी वास्तव में आवश्यकता नहीं है। विंडोज एपीआई ज्यादातर डिजाइन किए गए हैं, ताकि Windows XP पर प्रोग्राम की शुरुआत के मामले में आपको Windows 7 के लिए परिभाषित CERT_CHAIN_ENGINE_CONFIG के उपयोग में कोई समस्या नहीं होगी। आप

#define WINVER 0x0500 
#define _WIN32_WINNT 0x0500 

(या 0x0500 के बजाय 0x0501) को परिभाषित करते हैं आप विंडोज 7 में अपने कार्यक्रम चलाने के लिए सक्षम हो जाएगा, लेकिन आप hExclusiveRoot और hExclusiveTrustedPeople सदस्यों का उपयोग करने में सक्षम नहीं होगा। कारण cbSize फ़ील्ड है जिसे आपको sizeof(CERT_CHAIN_ENGINE_CONFIG) के रूप में प्रारंभ करना चाहिए। यह CertCreateCertificateChainEngine इनपुट संरचना CERT_CHAIN_ENGINE_CONFIG के आकार के बारे में पर्याप्त जानकारी के लिए देता है। cbSize के छोटे मूल्य के मामले में, अंतिम HCERTSTORE सदस्य hExclusiveRoot और hExclusiveTrustedPeople का उपयोग नहीं किया जाएगा।

4

NTDDI_WIN7 का मान जो मेरे मामले में गलत है क्योंकि मेरा एक एक्सपी एसपी 3 मशीन है।

जैसा कि मैं इसे समझता हूं, वैरिएबल प्रारंभ किए जाते हैं कि आप किस प्रणाली को लक्षित कर रहे हैं, न कि आप किस सिस्टम को कोड संकलित कर रहे हैं। तो आपको अपनी प्रोजेक्ट सेटिंग्स को देखने और देखने की ज़रूरत है, आपका लक्ष्य प्लेटफार्म क्या है, किस शीर्षलेख का संदर्भ दिया जाता है आदि।

+0

@ यूजीन, मेरा लक्ष्य सिस्टम XP, Vista, Win7, Server2003 और सर्वर 2008 होगा। क्या आप परियोजना सेटिंग्स को कॉन्फ़िगर करने के तरीके पर अपनी अंतिम वाक्य विस्तृत कर सकते हैं। या कुछ पॉइंटर्स के साथ शुरू करने के लिए? धन्यवाद – Raj

+0

@राज आपके पास प्रोजेक्ट स्रोत कोड है और मुझे नहीं पता कि * आपके * प्रोजेक्ट में परिभाषा कहां और कैसे सेट की गई है। यदि आप Google में "NTDDI_WIN7" खोजते हैं, तो पहला लिंक http://msdn.microsoft.com/en-us/library/aa383745%28v=vs.85%29.aspx है, जो आपके लिए सहायक हो सकता है (हालांकि यह आपके विपरीत कार्य को लक्षित करता है)। –

+0

@ यूजीन। मैंने अपनी मूल सेटिंग्स को मेरे प्रोजेक्ट सेटिंग्स के स्क्रीन शॉट्स के साथ संपादित किया है। जो लिंक आपने दिखाया है वह मुझे प्रीप्रोसेसर निर्देशों को परिभाषित करने की इजाजत दे रहा है जो उन सभी को शामिल करने के बजाय मेरे लक्षित प्लेटफॉर्म को प्रतिबंधित कर देगा। क्या आप कुछ भी सिफारिश कर सकते हैं? धन्यवाद – Raj