Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Полтергейст в Visual Studio...  (Прочитано 11256 раз)
0 Пользователей и 1 Гость смотрят эту тему.
RuNTiME
Помогающий

ru
Offline Offline
Пол: Мужской

« : 13-10-2008 08:24 » 

Всем привет! Я столкнулся довольно со странной ошибкой при компиляции в Visual Studio. Выглядит она, как обычная ошибка синтаксиса:
Код:
c:\proj\conslib\conslib\console.h(153) : error C2061: syntax error : identifier 'PCONSOLE_SELECTION_INFO'
Вот собственно на это ругается компилятор:
Код:
//console.h
class CConsole
{
public:
CConsole();
~CConsole();

//error C2061: syntax error : identifier 'PCONSOLE_SELECTION_INFO'
BOOL GetSelectionInfo(PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo) const;

};

//console.cpp
BOOL CConsole::GetSelectionInfo(PCONSOLE_SELECTION_INFO lpConsoleSelectionInfo) const
{ return ::GetConsoleSelectionInfo(lpConsoleSelectionInfo); }

Вся собственно странность состоит в том, что если вместо PCONSOLE_SELECTION_INFO, в объявлении функции написать void*, откомпилировать, затем обратно поменять на PCONSOLE_SELECTION_INFO и откомпилировать снова, то ошибка исчезает.
И соответственно, если почистить проект "Clean Solution" ошибка появляется снова.
Пробовал компилить в студиях 2003, 2005, 2008... эффект везде один.
« Последнее редактирование: 13-10-2008 08:28 от RuNTiME » Записан

Любимая игрушка - debugger ...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #1 : 13-10-2008 08:31 » 

значит, не включен какой то заголовок, где определена PCONSOLE_SELECTION_INFO )
Записан

RuNTiME
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 13-10-2008 08:37 » 

Алексей1153++, PCONSOLE_SELECTION_INFO объявлена в wincon.h, который в свою очередь подключается в windows.h... windows.h в проект подключен

Иерархия заголовков такая:

console.h
  #include <windows.h>

console.cpp
  #include <console.h>

Записан

Любимая игрушка - debugger ...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #3 : 13-10-2008 09:01 » 

хм, даже не знаю...

если console.h - это твой файл, попробуй перед "class CConsole{"  написать строку

struct CONSOLE_SELECTION_INFO;
Записан

RuNTiME
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #4 : 13-10-2008 09:01 » 

Разобрался в чем было дело. В проверке #if(_WIN32_WINNT >= 0x0500)

Код:
#if(_WIN32_WINNT >= 0x0500)
typedef struct _CONSOLE_SELECTION_INFO {
    DWORD dwFlags;
    COORD dwSelectionAnchor;
    SMALL_RECT srSelection;
} CONSOLE_SELECTION_INFO, *PCONSOLE_SELECTION_INFO;

Иерархия заголовков была такая:

console.h
  #define _WIN32_WINNT 0x0500
  #include <windows.h> //это подключение заголовка не срабатывало, т.к.
 //windows.h был подключен в main.cpp

console.cpp
  #include <console.h>

main.cpp
// windows.h подключался без #define _WIN32_WINNT 0x0500
// теперь убран за ненадобностью
//  #include <windows.h>
  #include <console.h>

Записан

Любимая игрушка - debugger ...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #5 : 13-10-2008 09:03 » 

а, вона чё. Тогда всё упрощается: найти определение _WIN32_WINNT  в файлах студии и поставить значение 0x500 (там щас, наверное  0x400)
Записан

RuNTiME
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 13-10-2008 09:06 » 

Алексей1153++, console.h и console.cpp мои, по этому прописал в console.h

#define _WIN32_WINNT 0x0500

все щас работает Улыбаюсь
Записан

Любимая игрушка - debugger ...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #7 : 13-10-2008 09:51 » 

RuNTiME, насчёт твоих файлов не знаю, а у меня, к примеру, в родных файлах студии, в файле windows.h имеется дефайн

#define WINVER 0x0400

который я поменял на

#define WINVER 0x0500

чтобы некоторые вещи стали быть определены Улыбаюсь У тебя что то похожее

А вообще, не имею привычки править родные студийные файлы - чревато ) Но тут никак иначе

Записан

RuNTiME
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #8 : 13-10-2008 10:14 » 

Алексей1153++, вообще, когда создаешь в студии проект, по умолчанию создается файлик stdafx.h
Код:
// stdafx.h : include file for standard system include files,
// or project specific include files that are used frequently, but
// are changed infrequently
//

#pragma once

// Modify the following defines if you have to target a platform prior to the ones specified below.
// Refer to MSDN for the latest info on corresponding values for different platforms.
#ifndef WINVER // Allow use of features specific to Windows XP or later.
#define WINVER 0x0501 // Change this to the appropriate value to target other versions of Windows.
#endif

#ifndef _WIN32_WINNT // Allow use of features specific to Windows XP or later.                   
#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows.
#endif

#ifndef _WIN32_WINDOWS // Allow use of features specific to Windows 98 or later.
#define _WIN32_WINDOWS 0x0410 // Change this to the appropriate value to target Windows Me or later.
#endif

#ifndef _WIN32_IE // Allow use of features specific to IE 6.0 or later.
#define _WIN32_IE 0x0600 // Change this to the appropriate value to target other versions of IE.
#endif

#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers
// Windows Header Files:
#include <windows.h>
#include <stdlib.h>



// TODO: reference additional headers your program requires here

Как раз в нем и объявлен этот макрос:
Код:
#ifndef _WIN32_WINNT		// Allow use of features specific to Windows XP or later.                   
#define _WIN32_WINNT 0x0501 // Change this to the appropriate value to target other versions of Windows.
#endif
Так, что править студийные файлы не стоит:)
У меня щас создан полностью пустой проект, по этому stdafx.h в него не был включен:) Так что пришлось задефайнить его у себя в console.h ...
Записан

Любимая игрушка - debugger ...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #9 : 13-10-2008 10:26 » 

у нас студии разные Улыбаюсь
у меня этот файл такой

Код:
// stdafx.h : include file for standard system include files,
//  or project specific include files that are used frequently, but
//      are changed infrequently
//

#if !defined(AFX_STDAFX_H__BE0AF666_EBBF_11D8_BED9_DF121DF42A52__INCLUDED_)
#define AFX_STDAFX_H__BE0AF666_EBBF_11D8_BED9_DF121DF42A52__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000

#define VC_EXTRALEAN // Exclude rarely-used stuff from Windows headers

#include <afxwin.h>         // MFC core and standard components
#include <afxext.h>         // MFC extensions
#include <afxdisp.h>        // MFC Automation classes
#include <afxdtctl.h> // MFC support for Internet Explorer 4 Common Controls
#ifndef _AFX_NO_AFXCMN_SUPPORT
#include <afxcmn.h> // MFC support for Windows Common Controls
#endif // _AFX_NO_AFXCMN_SUPPORT
//#include <afxsock.h>



#include <Afxdb.h> //базы данных

#include <afxtempl.h>         // MFC extensions
#include <afxmt.h>          // Multithread
#include <afxsock.h> // MFC socket extensions
#include <atlconv.h> //ATL (в частности - работа сбитмапами)

//{{AFX_INSERT_LOCATION}}
// Microsoft Visual C++ will insert additional declarations immediately before the previous line.

#endif // !defined(AFX_STDAFX_H__BE0AF666_EBBF_11D8_BED9_DF121DF42A52__INCLUDED_)


Записан

RuNTiME
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #10 : 13-10-2008 10:50 » 

Алексей1153++, ты просто создаешь MFC проект, а я создаю простой консольный без поддержки MFC и ATL. Улыбаюсь
Записан

Любимая игрушка - debugger ...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #11 : 13-10-2008 10:53 » 

так какая разница то, у меня WINVER всё равно в  <windows.h> определён
Записан

RuNTiME
Помогающий

ru
Offline Offline
Пол: Мужской

« Ответ #12 : 13-10-2008 11:18 » 

так какая разница то, у меня WINVER всё равно в  <windows.h> определён
Разница в том, что для MFC и простого проекта, создаются разные stdafx.h. В MFC варианте макрос _WIN32_WINNT не определен. Он видимо дефайнится внутри хедеров самой MFC. Просто думаю, что править студийные файлы не нужно, в этом случае, может привести к проблемам компиляции старых проектов.
Записан

Любимая игрушка - debugger ...
Алексей++
глобальный и пушистый
Глобальный модератор

ru
Offline Offline
Сообщений: 13


« Ответ #13 : 13-10-2008 11:44 » 

RuNTiME, не, для старых проектов ничего не будет, во первых, у меня их нет, во вторых в старых не используется то, что открывает значение 0x500 Улыбаюсь

а _WIN32_WINNT у меня в MFC проекте нигде не определён
Записан

Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines