2015-01-19 5 views
0

В моем классе C++ я хочу использовать функцию Get API GetFileSizeEx(). Когда я компилирую мой код, составителя сказал:Функция WIN API GetFileSizeEx() не была объявлена ​​в этой области

"error: 'GetFileSizeEx' was not declared in this scope".

Однако другие функции, такие как CreateFile() или WriteFile() работает отлично.

В моем заголовке класса, я объявляю:

#if defined(WINVER) && WINVER==0x0602 /* windows 8 */ 
#define WINVER 0x0602 
#define _WIN32_WINNT 0x0602 
#elif defined(WINVER) && WINVER==0x0601 /* windows 7 */ 
#define WINVER 0x0601 
#define _WIN32_WINNT 0x0601 
#elif defined(WINVER) && WINVER==0x0600 /* windows vista and server 2008 */ 
#define WINVER 0x0600 
#define _WIN32_WINNT 0x0600 
#elif defined(WINVER) && WINVER==0x0502 /* server 2003 */ 
#define WINVER 0x0502 
#define _WIN32_WINNT 0x0502 
#elif defined(WINVER) && WINVER==0x0501 /* windows xp */ 
#define WINVER 0x0501 
#define _WIN32_WINNT 0x0501 
#endif 

#include <windows.h> 
#include <winbase.h> 
#include <string> 

В моем классе .cpp:

Test::Test() 
{ 
hFile = CreateFile(TEXT("conf/configure_tool.txt"), 
          GENERIC_READ | GENERIC_WRITE, 
          0, 
          NULL, 
          OPEN_EXISTING, 
          0, 
          NULL); 

if (hFile == INVALID_HANDLE_VALUE) 
{ 
    canAcces = false; 
}else 
{ 
    if(GetFileSizeEx(hFile,&sized) != 0) 
    { 
     canAcces = true; 
    } 
} 
} 

У вас возникла идея решить мою проблему?

+1

Этот заголовок, кажется, пытается решить проблему с курицей и яйцом. Наверное, никогда не приходил к яйцу. Избавьтесь от него и просто определите _WIN32_WINNT подходящую версию. 0x502 - это минимум, который вы должны выбрать, если хотите, чтобы ошибка по-прежнему поддерживалась XP, 0x600 в противном случае. –

+0

Хм, хорошо, я начинаю понимать. Если я использую только: #define WINVER 0x0601 #define _WIN32_WINNT 0x0601 Компилятор ответил: «error:« WINVER »переопределено« Возможно, у меня проблема с этим макросом, и поэтому мой предыдущий код не работает? – ExecAssa

+0

Есть ли особая причина, по которой вы определяете 'WINVER' и' _WIN32_WINNT' в коде вместо ваших настроек проекта? –

ответ

1

От documentation:

Таким образом, вы должны убедиться, что вы определили WINVER быть 0x0501 или больше.

Если это не решит проблему, тогда вероятная причина в том, что вы используете недостаточный SDK. Возможно, из старой версии компилятора, отличного от MS. Убедитесь, что у вас есть обновленный SDK.

Следует сказать, что условный код в вопросе, который пытается определить _WIN32_WINNT, является немного странным. Почему бы вам не определить _WIN32_WINNT в то же время, что и вы определяете WINVER?

+0

Оки, THX за вашу помощь. Я пытаюсь использовать простой макрос для тестирования: #define WINVER 0x0601 #define _WIN32_WINNT 0x0601 Но компилятор ответил: "Ошибка: "WinVer" переопределены" идея? – ExecAssa

+0

Ну, узнайте, где вы определили 'WINVER', и посмотрите, какое значение оно имеет. Кроме того, вы знаете, откуда появился ваш SDK? Вы знаете, какой компилятор вы используете? –

+0

Конечно, я использую компилятор MinGW tdm-gcc 4.8.1. Для SDK я использую MinGW win32 «windows.h» И я определяю WINVER после включения заголовка окна. – ExecAssa

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