2013-02-10 5 views
1

Эта проблема может быть не так легко решить, как вы сначала думаете.Почему я не могу объявить переменную, структура которой определена?

FILTER_MESSAGE_HEADER является структура, определенная в заголовочном файле fltUserStructures.h, который является стандартным заголовочный файл Windows SDK находится в SDK включает путь, т.е.

"C:\Program Files (x86)\Windows Kits\8.0\Include\shared\fltUserStructures.h".

typedef struct _FILTER_MESSAGE_HEADER { 

    // 
    // OUT 
    // 
    // Total buffer length in bytes, including the FILTER_REPLY_HEADER, of 
    // the expected reply. If no reply is expected, 0 is returned. 
    // 

    ULONG ReplyLength; 

    // 
    // OUT 
    // 
    // Unique Id for this message. This will be set when the kernel message 
    // satifies this FilterGetMessage or FilterInstanceGetMessage request. 
    // If replying to this message, this is the MessageId that should be used. 
    // 

    ULONGLONG MessageId; 

    // 
    // General filter-specific buffer data follows... 
    // 

} FILTER_MESSAGE_HEADER, *PFILTER_MESSAGE_HEADER; 

Однако, следующий код не может быть составленный VC++ 2012.

#include <fltUserStructures.h> 

int main() 
{ 
    // 
    // error C2065: 'FILTER_MESSAGE_HEADER' : undeclared identifier 
    // 
    FILTER_MESSAGE_HEADER v; 
} 

или

#define NTDDI_VERSION 0x06000000 // Vista or later 
#include <FltUser.h> 

int main() 
{ 
    // 
    // fltuserstructures.h(27): fatal error C1012: 
    // unmatched parenthesis : missing ')' 
    // 
    FILTER_MESSAGE_HEADER v; 
} 

Хотя я пробовал много методов, компилятор всегда отклонил приведенный выше код. В чем причина?

+0

Для тех из нас, у кого нет установленных SDK Windows, как выглядит определение структуры? – duskwuff

+0

Попробуйте включить FltUser.h вместо –

+0

@ André, в том числе FltUser.h вместо этого создаст еще одну ошибку: фатальная ошибка C1012: несогласованная скобка: missing ')' – xmllmx

ответ

2

Эта структура (и многое из того, в fltUserStructures.h условно составлен на основе FLT_MGR_BASELINE в свою очередь, установлена ​​в fltUser.h:

#define FLT_MGR_BASELINE (((OSVER(NTDDI_VERSION) == NTDDI_WIN2K) && (SPVER(NTDDI_VERSION) >= SPVER(NTDDI_WIN2KSP4))) || \ 
          ((OSVER(NTDDI_VERSION) == NTDDI_WINXP) && (SPVER(NTDDI_VERSION) >= SPVER(NTDDI_WINXPSP2))) || \ 
          ((OSVER(NTDDI_VERSION) == NTDDI_WS03) && (SPVER(NTDDI_VERSION) >= SPVER(NTDDI_WS03SP1))) || \ 
          (NTDDI_VERSION >= NTDDI_VISTA)) 

Так, #include <fltuser.h> вместо, и убедитесь, что NTDDI_VERSION установлена ​​надлежащим образом (с использованием WINVER , например):

#define WINVER 0x0600 
#include <windows.h> 
#include <fltUser.h> 

int main() 
{ 
    // 
    // error C2065: 'FILTER_MESSAGE_HEADER' : undeclared identifier 
    // 
    FILTER_MESSAGE_HEADER v; 
} 
+0

Это решение не работает. "фатальная ошибка C1012: несогласованная скобка: missing ')'" – xmllmx

+0

Пересмотренная версия еще не работает. "sdkddkver.h (264): фатальная ошибка C1189: #error: параметр NTDDI_VERSION конфликтует с настройкой _WIN32_WINNT" – xmllmx

+0

Я скопировал код из вашего сообщения. то есть #define WINVER 0x0600 #include #include xmllmx

Смежные вопросы