问题
Hi I am having 2 VC++ solutions "A" & "B" (VS2008) both are having the same codebase (with just few lines of code different). Using DXVAHD.h in both.
dxvahd.h is a standard Microsoft header file. If we open this header file, we see there is a conditional if
"#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)
"
I see that in VC++ solution "A", the above conditional #if statement is false, hence the whole dxvahd header file gets greyed out & is not even compiled!!
Whereas in another solution "B", this conditional #if is true,hence no issues & its working fine.
Can anyone kindly let me know how do I resolve this issue in solution "A", wherein the above #if is getting greyed out / not compiling. PLz help me.
Thanks in advance.
回答1:
Looking at winapifamily.h, you can see that these macros are used to determine what platform you have and what API's are suitable for your platform.
/*
* 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)
So your WINAPI_PARTITION_DESKTOP
would only be set if you are running on a Desktop family of the the system.
回答2:
WINAPI_FAMILY is also set depending on the targeted Windows version.
See this discussion and the linked blog post series.
In particular, if you're not writing an "App" (for >= Win 8) then:
Prefer use of the standard _WIN32_WINNT Windows Defines for selecting the correct Win32 API (i.e. many Win32 APIs required for use in Windows Store apps are the Vista (0x0600), Windows 7 (0x0601), or Windows 8 (0x0602) version.
You can use WINVER or _WIN32_WINNT.
来源:https://stackoverflow.com/questions/15292199/when-does-if-winapi-family-partitionwinapi-partition-desktop-in-dxvahd-h-micr