5

Xin chào Tôi đang có 2 giải pháp VC++ "A" & "B" (VS2008) cả hai đều có cùng một codebase (chỉ với một vài dòng mã) khác nhau). Sử dụng DXVAHD.h trong cả hai.Khi nào #if WINAPI_FAMILY_PARTITION (WINAPI_PARTITION_DESKTOP) trong dxvahd.h Tập tin tiêu đề Microsoft trở thành sự thật

dxvahd.h là tệp tiêu đề Microsoft chuẩn. Nếu chúng ta mở tập tin tiêu đề này, chúng ta thấy có một điều kiện nếu "#if WINAPI_FAMILY_PARTITION(WINAPI_PARTITION_DESKTOP)"

Tôi thấy rằng trong VC++ giải pháp "A", các điều kiện tuyên bố # nếu trên là sai, do đó các tập tin tiêu đề toàn dxvahd bị mờ đi & không phải là thậm chí được biên dịch !!

Trong khi ở một giải pháp khác "B", điều kiện #if này là đúng, do đó không có vấn đề gì &.

Bất kỳ ai cũng có thể cho tôi biết cách giải quyết vấn đề này trong giải pháp "A", trong đó #if ở trên bị chuyển sang màu xám/không biên dịch. Làm ơn giúp tôi.

Xin cảm ơn trước.

Trả lời

7

Nhìn vào winapifamily.h, bạn có thể thấy rằng các macro này được sử dụng để xác định nền tảng nào bạn có và API nào phù hợp với nền tảng của bạn.

/* 
* 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) 

Vì vậy, WINAPI_PARTITION_DESKTOP sẽ chỉ được đặt nếu bạn đang chạy trên họ máy tính để bàn của hệ thống.

+0

Nhưng cả hai giải pháp "A" & "B" đều được biên dịch và chạy trên cùng một hệ thống, cùng một hệ điều hành, cùng một nền tảng. Tôi thực sự tự hỏi nếu nó có thể được bất kỳ cài đặt trong VS2008, đó là gây ra sự khác biệt trong 2 giải pháp. – codeLover

+0

@codeLover AFAIK đây là dành cho ứng dụng Metro so với ứng dụng dành cho máy tính để bàn, lần cuối tôi kiểm tra, Metro không được hỗ trợ trong VS2008. Liệu tôi có sai? –

+0

Chạy cả hai giải pháp trên máy tính để bàn Win7 và cả hai đều là ứng dụng dành cho máy tính để bàn. – codeLover

0

WINAPI_FAMILY cũng được đặt tùy thuộc vào phiên bản Windows được nhắm mục tiêu.

Xem this discussion và liên kết blog post series.

Đặc biệt, nếu bạn không viết một "App" (đối với> = Win 8) thì:

thích sử dụng các tiêu chuẩn của Windows _WIN32_WINNT Xác lựa chọn Win32 API đúng (tức là nhiều Win32 API cần thiết để sử dụng trong các ứng dụng Windows Store là Vista (0x0600), Windows 7 (0x0601), hoặc Windows 8 (0x0602) phiên bản.

Bạn có thể sử dụng WINVER or _WIN32_WINNT.

Các vấn đề liên quan