为什么NTDDI_VERSION宏将其值从cpp更改为ntdddisk.h?
我正在使用带有累积更新4的Visual Studio 2012,并在Windows 7 x64上构建。
在一个CPP中,我需要为WIN 8调用新的IOCTL_ ..
在CPP中有#include
ntdddisk.h在受保护的条件下定义WIN 8的新IOCTL_:
#if (NTDDI_VERSION >= NTDDI_WIN8)
...
#endif
在cpp中,NTDDI_VERSION宏的值为NTDDI_WIN8(如预期的结果,包括sdkddkver.h和使用/ D_WIN32_WINNT = 0x0602进行编译)
但是,在ntdddisk.h中,NTDDI_VERSION宏的值具有值< NTDDI_VISTA,即小于NTDDI_WIN8
编译失败,错误
error C2065: 'IOCTL_..' : undeclared identifier
看起来像一个bug,除非我错过了其他的东西。想法?
详情如下:
在CPP文件中有这些包括
#pragma once
// Needed for new IOCTL_ for WIN 8
#include <sdkddkver.h>
#include <windows.h>
// Check NTDDI_VERSION ...
#if (NTDDI_VERSION >= NTDDI_WIN8)
// Value is NTDDI_WIN8 as expected
// #include <TROUBLE.h>
#endif
#pragma pack(8)
#include <ntdddisk.h>
#include <ntddscsi.h>
#include <lm.h>
#include <objbase.h>
/*=== IMPORTANT: this struct needs to have 8-byte packing ===*/
typedef struct _SCSI_PASS_THROUGH_WITH_BUFFERS {
SCSI_PASS_THROUGH spt;
ULONG Filler; // realign buffers to double word boundary
UCHAR SenseBuf[32];
UCHAR DataBuf[512];
} SCSI_PASS_THROUGH_WITH_BUFFERS;
#pragma pack()
使用CL编译具有这些参数,包括-D_WIN32_WINNT = 0x0602
cl -nologo @COMPL.TMP /Fo..\\..\\..\\optimized\\obj\\x86\\CPP.obj CPP.cpp
COMPL.TMP包含
/I*** application-headers ***
-D_AFXDLL -c -D_CRT_SECURE_NO_DEPRECATE -D_CRT_NONSTDC_NO_DEPRECATE -DBTREEDB -O2 -Ox -MD -Zi -DNT_CLIENT -DWIN32 -D"_CONSOLE" -D_THREADS -D_OPSYS_TYPE=DS_WINNT -DPSAPI_VERSION=1 -D_WIN32_WINNT=0x0602 -TP -DMBCS=1 -D_LONG_LONG=1 -D_DSM_VLK_BTREE -DDSM_WIDECHAR -D_UNICODE -DUNICODE -DUSE_XML=1 -DXMLUTIL_EXPORTS=1 -DUSE_XERCES_2_8=1 -DPEGASUS_PLATFORM_WIN32_IX86_MSVC=1 -DPEGASUS_USE_EXPERIMENTAL_INTERFACES -Zp1 -D_DSM_LONG_NAME -W3 -EHsc -GF
答案 0 :(得分:2)
问题不在于_WIN32_WINNT
或NTDDI_VERSION
宏。
问题在于windows.h
间接地包含winioctl.h
,其中有几条好奇的线路在中途:
#ifndef _NTDDDISK_H_
#define _NTDDDISK_H_
不出所料,ntdddisk.h
从那些相同的行开始,因此实际上根本不包括在内。
我无法轻易想出可以解决这个问题的标题组合或排序 - 我认为这是MS真正需要解决的问题。
然而,以下可怕的解决方法(我真的不建议,除非你无法从MS获得任何帮助)似乎让编译器实际处理ntdddisk.h
:
#define _NTDDDISK_H_
#include <windows.h>
#undef _NTDDDISK_H_
但是,我怀疑这个黑客可能会出现其他问题 - 所以如果您决定使用它,请仔细测试。
答案 1 :(得分:1)
我不确定这是我需要的,但插入
后编译工作 #define _NTDDDISK_H_
#include <windows.h>
...
#undef _NTDDDISK_H_
#include <ntdddisk.h>
感谢您的建议。