W C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include\WinCrypt.h definicja CERT_CHAIN_ENGINE_CONFIG to

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;

Używam Visual Studio 2010 na maszynie XP sp3, w takim przypadku spodziewam się, że dwa następne elementy w powyższej strukturze zostaną wyszarzone. Ale tak się nie dzieje,

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

NTDDI_VERSION z kolei jest zdefiniowany w sdkddkver.h w następujący sposób, a _WIN32_WINNT w jakiś sposób przyjmuje wartość NTDDI_WIN7, co w moim przypadku jest niepoprawne, ponieważ mój jest maszyną 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

Powyższe dwa elementy struktury CERT_CHAIN_ENGINE_CONFIG, o których mowa, nie są obecne w C:\Program Files\Microsoft SDKs\Windows\v6.0A\Include\WinCrypt.hAle mój projekt Visual Studio 2010 automatycznie pobiera pliki nagłówkowe i lib z C:\Program Files\Microsoft SDKs\Windows\v7.0A\Include\WinCrypt.h Z powodu sprzecznych struktur, ja dostaję parameter is incorrect

Proszę doradzić, jak mogę rozwiązać ten problem?

Czy powinienem zainstalować Visual Studio 2010 sp1?

znalazłem jedno odniesienie w sieci, w którym jest napisane, że inicjalizacja struktury rozwiąże problem, ale tak się nie stanie, ponieważ oba parametry nie będą wyszarzone i zostanie przyjęta podczas budowy.

Update1:

Ustawienia mojego projektu:

tu wpisz opis obrazu $(VCInstalDir) -> C:\Program Files\Microsoft Visual Studio 10.0\VC

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

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

Ustawienia plików bibliotecznych,

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

AKTUALIZACJA 2: Moje definicje preprocesora to

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

%(PreprocessorDefinitions) odziedziczonych wartości w następujący sposób

_WINDLL
_MBCS

Dzięki

7
Raj 21 czerwiec 2011, 21:12

2 odpowiedzi

Najlepsza odpowiedź

Problem, który masz, można bardzo łatwo wyjaśnić. Jeśli używasz v7.0A lub v7.1, możesz skompilować swój projekt tak, aby działał pod Windows 7. Tak więc domyślną wartością dla _WIN32_WINNT jest 0x0601.

Jeśli chcesz wspólnie skompilować program, aby działał w systemie Windows XP, możesz zdefiniować WINVER i _WIN32_WINNT jawnie. Zwykle robi się to w ustawieniach projektu Visual Studio w definicjach preprocesora. Jeśli to zrobisz, odpowiednia część struktury CERT_CHAIN_ENGINE_CONFIG będzie wyświetlana w kolorze szarym, tak jak chcesz.

W większości przypadków iw przypadku CERT_CHAIN_ENGINE_CONFIG nie jest to naprawdę potrzebne. Windows API jest zaprojektowane przede wszystkim tak, abyś nie miał problemów z korzystaniem z CERT_CHAIN_ENGINE_CONFIG zdefiniowanego dla Windows 7 w przypadku startu programu na Windows XP. Jeśli zdefiniujesz

#define WINVER 0x0500
#define _WIN32_WINNT 0x0500

(lub 0x0501 zamiast 0x0500) będziesz mógł uruchomić swój program w Windows 7, ale nie będziesz mógł korzystać z hExclusiveRoot i hExclusiveTrustedPeople członków . Powodem jest pole cbSize, które należy zainicjować jako sizeof(CERT_CHAIN_ENGINE_CONFIG). Daje to funkcji CertCreateCertificateChainEngine wystarczającą ilość informacji o rozmiarze struktury wejściowej CERT_CHAIN_ENGINE_CONFIG. W przypadku małej wartości cbSize, ostatni HCERTSTORE członkowie hExclusiveRoot i hExclusiveTrustedPeople po prostu nie będą używane.

4
Oleg 1 lipiec 2011, 18:28

wartość NTDDI_WIN7, która w moim przypadku jest nieprawidłowa, ponieważ moja jest maszyną XP SP3.

Jak rozumiem, zmienne są inicjowane w zależności od tego, na jaki system celujesz, a nie na jakim systemie kompilujesz kod. Musisz więc przyjrzeć się ustawieniom swojego projektu i zobaczyć, jaka jest Twoja platforma docelowa, do jakich nagłówków się odnoszą itd. .

4
Eugene Mayevski 'Callback 21 czerwiec 2011, 22:05
@Eugene, Moje docelowe systemy to XP,Vista,Win7, Server2003 i serwer 2008. Czy możesz omówić ostatnie zdanie dotyczące konfiguracji ustawień projektu. lub kilka wskazówek na początek? Dziękuję
 – 
Raj
21 czerwiec 2011, 23:27
Masz kod źródłowy projektu, a ja nie wiem, gdzie i jak są ustawione definicje w twój projekcie. Jeśli szukasz „NTDDI_WIN7” w Google, pierwszy link to msdn.microsoft.com/en-us/library/aa383745%28v=vs.85%29.aspx, który może być dla Ciebie pomocny (chociaż jest skierowany do zadania przeciwnego do Twojego).
 – 
Eugene Mayevski 'Callback
22 czerwiec 2011, 00:19
@Eugeniusz. Edytowałem mój oryginalny post ze zrzutami ekranu z ustawieniami mojego projektu. Link, który pokazałeś, pozwala mi zdefiniować dyrektywy preprocesora, które ograniczą moje platformy docelowe, zamiast uwzględniać je wszystkie. Czy jest coś, co mógłbyś polecić? Dziękuję
 – 
Raj
22 czerwiec 2011, 01:27
1
Nie chodzi o ścieżki, ale o definicje, które posiada twój projekt. Definicje są określone na karcie Kompilator -> Preprocesor. Również niektóre definicje są ustawiane automatycznie po wybraniu różnych opcji. Jeden pomysł: w oknie dialogowym właściwości projektu znajduje się strona, która zawiera wszystkie opcje wiersza poleceń. Tam możesz zobaczyć, jakie definicje są ustawione.
 – 
Eugene Mayevski 'Callback
22 czerwiec 2011, 14:39
@Eugeniusz. Nie mogłem uruchomić dyrektyw preprocesora, zamiast tego użyłem zestawu narzędzi platformy i przełączyłem się z powrotem na 6.0A i uruchomiłem go, nie tracąc wiele poza nazwą dostawcy RSA_AES_XP. Dodałem dyrektywę preprocesora, jeśli daje to pojęcie o tym, jak nadal mogę polegać na manipulowaniu dyrektywami preprocesora. Dzięki
 – 
Raj
23 czerwiec 2011, 18:20