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.h
Ale 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:
$(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
2 odpowiedzi
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.
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. .
Podobne pytania
Powiązane pytania
Nowe pytania
c++
C ++ to język programowania ogólnego przeznaczenia. Pierwotnie został zaprojektowany jako rozszerzenie C i ma podobną składnię, ale teraz jest to zupełnie inny język. Użyj tego tagu w przypadku pytań dotyczących kodu (który ma zostać) skompilowany za pomocą kompilatora C ++. Użyj znacznika specyficznego dla wersji w przypadku pytań związanych z określoną wersją standardu [C ++ 11], [C ++ 14], [C ++ 17], [C ++ 20] lub [C ++ 23] itp. .