5

Witam Mam 2 rozwiązania VC++ "A" & "B" (VS2008) oba mają tę samą bazę kodów (z zaledwie kilkoma liniami kodu różne). Używanie DXVAHD.h w obu.Kiedy #V WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_DESKTOP) w pliku nagłówkowym Microsoft dxvahd.h staje się prawdą

dxvahd.h to standardowy plik nagłówkowy Microsoft. Jeśli otworzymy ten plik nagłówka, widzimy tam jest warunkowy jeśli „#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)

widzę, że w VC++ roztworu „A”, powyższe warunkowe oświadczenie #if jest fałszywa, stąd plik header cały dxvahd zostaje wyszarzony & nie jest nawet skompilowany !!

Podczas gdy w innym rozwiązaniu "B", to warunkowe #if jest prawdziwe, a więc nie ma problemów z jego sprawnym działaniem &.

Czy ktoś może uprzejmie poinformować mnie, w jaki sposób rozwiązać ten problem w roztworze "A", w którym powyższy #if staje się szary/nie kompiluje. PLz, pomóż mi.

Z góry dziękuję.

Odpowiedz

7

Patrząc na winapifamily.h widać, że te makra są używane do określenia, jaka platforma posiadasz i jakie API są odpowiednie dla Twojej platformy.

/* 
* Windows APIs can be placed in a partition represented by one of the below bits. The 
* WINAPI_FAMILY value determines which partitions are available to the client code. 
*/ 

#define WINAPI_PARTITION_DESKTOP 0x00000001 
#define WINAPI_PARTITION_APP  0x00000002  

/* 
* A family may be defined as the union of multiple families. WINAPI_FAMILY should be set 
* to one of these values. 
*/ 
#define WINAPI_FAMILY_APP   WINAPI_PARTITION_APP 
#define WINAPI_FAMILY_DESKTOP_APP (WINAPI_PARTITION_DESKTOP | WINAPI_PARTITION_APP)  

/* 
* A constant that specifies which code is available to the program's target runtime platform. 
* By default we use the 'desktop app' family which places no restrictions on the API surface. 
* To restrict the API surface to just the App API surface, define WINAPI_FAMILY to WINAPI_FAMILY_APP. 
*/ 
#ifndef WINAPI_FAMILY 
#define WINAPI_FAMILY WINAPI_FAMILY_DESKTOP_APP 
#endif 

/* Macro to determine if a partition is enabled */ 
#define WINAPI_FAMILY_PARTITION(Partition) ((WINAPI_FAMILY & Partition) == Partition) 

/* Macro to determine if only one partition is enabled from a set */ 
#define WINAPI_FAMILY_ONE_PARTITION(PartitionSet, Partition) ((WINAPI_FAMILY & PartitionSet) == Partition) 

więc WINAPI_PARTITION_DESKTOP będzie ustawiona tylko jeśli działa na rodziny pulpicie systemu.

+0

Ale oba rozwiązania "A" i "B" są kompilowane i uruchamiane w tym samym systemie, tym samym systemie operacyjnym, tej samej platformie. Naprawdę zastanawiam się, czy to mogą być jakiekolwiek ustawienia w VS2008, co powoduje różnicę w 2 rozwiązaniach. – codeLover

+0

@codeLover AFAIK to jest dla aplikacji Metro a aplikacje na komputer, kiedy ostatnio sprawdzałem, Metro nie było obsługiwane w VS2008. Czy się mylę? –

+0

Uruchamianie obu rozwiązań na komputerze Win7 i obie są aplikacjami komputerowymi. – codeLover

0

WINAPI_FAMILY ustawia się również w zależności od docelowej wersji systemu Windows.

Zobacz this discussion i połączony blog post series.

W szczególności, jeśli nie jesteś pisanie "APP" (o> = Win 8), a następnie:

Wolę wykorzystanie standardowego _WIN32_WINNT systemu Windows Określa wyboru poprawnego Win32 API (to znaczy wiele Win32 API wymagane do zastosowania w aplikacjach sklepowych są Vista (0x0600), Windows 7 (0x0601) lub Windows 8 (0x0602) wersja.

można użyć WINVER or _WIN32_WINNT.