Форум программистов, компьютерный форум, киберфорум
Наши страницы

Если каждого консольного процесса существует свой дескриптор буфер экрана, то где именно он находится? - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Кодировка в консоли (на ЕГЭ) http://www.cyberforum.ru/cpp-beginners/thread948490.html
В этом году буду писать экзамен, но дело в том, что в visual studio setlocale(LC_ALL,"Rus"); не приводит ни к чему (знаю, что в самой консоли надо настраивать другой шрифт, который поддерживает...
C++ Убрать из слова каждую вторую гласную букву в диапазоне от 8 до 13 буквы тема: текстовые файлы. убрать из слова каждую вторую гласную букву в диапазоне от 8 до 13 буквы. http://www.cyberforum.ru/cpp-beginners/thread948483.html
C++ Файловый ввод-вывод в задаче
Не понимаю как составить вывод данных из файла в задаче (см.ниже), я вообще запутался с вводом выводом, помогите растолковать. Если cout (ostream) выводит текст, почему тогда объект fout (ofstream...
Поиск циклов отрицательной стоимости C++
Добрый день помогите с написание программы. Суть такова. На вход в программу подается в .txt граф представленный в таблице смежности. допустим перейти от A к B стоит -5 от B к C стоит 2 от C к D...
C++ как сложить/умножить/найти большее/найти меньшее/найти средние число http://www.cyberforum.ru/cpp-beginners/thread948432.html
привет всем подскажите как сложить/умножить/найти большее/найти меньшее/найти средние число из например 10 введенных чисел, в одной программе.Всем заранее респект.
C++ Чем отличаются операторы вывода? Чем отличаются операторы вывода cout и printf и какой более перспективно использовать? ;) подробнее

Показать сообщение отдельно
kravam
быдлокодер
1703 / 890 / 45
Регистрация: 04.06.2008
Сообщений: 5,489

Если каждого консольного процесса существует свой дескриптор буфер экрана, то где именно он находится? - C++

05.09.2013, 19:30. Просмотров 345. Ответов 0
Метки (Все метки)

То есть фишка в чём: если мы создадим консольный процесс, а потом ИЗМЕНИМ буфер экрана и сделаем его активным, то чёрта с два мы туда что-нибудь запишем общеизвестными функциям, например system ("dir"):

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
#include <windows.h>
#include <stdio.h>
using namespace std;
 
 
int main() 
{
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
  HANDLE  hConsoleOutput;    // для дескриптора буфера экрана
 
  //хэндл экрана новый
  HANDLE hStdOutNew; 
  
                                          //+  
                                          //+  
                                          //+  
                                          //+  
   
  //создадим буфер экрана (новый) 
  hStdOutNew = CreateConsoleScreenBuffer( 
    GENERIC_READ | GENERIC_WRITE, // чтение и запись 
    0,                            //не разделяемый 
    NULL,                         // защита по умолчанию 
    CONSOLE_TEXTMODE_BUFFER,      // текстовый режим 
    NULL);                        //не используется 
 
                                          //+  
                                          //+  
                                          //+  
                                          //+  
  
  //Проверим, правильно ли создали
  if (hStdOutNew == INVALID_HANDLE_VALUE) 
  {
    printf ("всё плохо\n"); 
    return GetLastError(); 
  }
 
                                          //+  
                                          //+  
                                          //+  
                                          //+  
  
  //Если правильно создали делаем активным новый буфер экрана 
  if (!SetConsoleActiveScreenBuffer(hStdOutNew)) 
  { 
    printf ("всё плохо\n"); 
    return GetLastError(); 
  } 
  
  //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  
  system ("dir");
  printf ("этой надписи мы никогда не увидим, равно как и вывода dir\n"); 
  
  //Теперь чтобы записать что-то в новый буфер экрана, надо использовать, 
  //например WRiteConsole, где первым параметром идёт буфер экрана
  
  
  getchar ();
  
  return 0; 
}
Почему? Наверное, когда в дело вступает dir, она читает дескриптор буфера экрана, который СТАРЫЙ и туда и пишет, я не знаю. Как в этом убедиться? Если мои предположения верны, то дескриптор буфера экрана, вполне возможно, прописан в какой-нибудь PEB. Тогда его можно заменить на новый, просто прописав внаглую память процесса, dir при выполнении обратится к НОВОМУ дескриптору буфера экрана и всё будет круто.

Но где в памяти процесса прописан дескриптор буфера экрана, знает кто-нибудь?

Добавлено через 30 минут
Короче, вообще непонятно. Вроде как для установки дескриптора для устройств стандартного ввода данных (и вывода) существует функция SetStdHandle. То есть если мы её задействуем, тем самым мы и поменяем дескриптор на нужный (то, что мне и нужно, но я хотел память напрямую прописать). Но ничего не выходит
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
#include <windows.h>
#include <stdio.h>
using namespace std;
 
 
#include <windows.h>
#include <stdio.h>
using namespace std;
 
 
int main() 
{
 SetConsoleCP(1251);
 SetConsoleOutputCP(1251);
  HANDLE  hConsoleOutput;    // для дескриптора буфера экрана
 
  //хэндл экрана новый
  HANDLE hStdOutNew; 
  
                                          //+  
                                          //+  
                                          //+  
                                          //+  
   
  //создадим буфер экрана (новый) 
  hStdOutNew = CreateConsoleScreenBuffer( 
    GENERIC_READ | GENERIC_WRITE, // чтение и запись 
    0,                            //не разделяемый 
    NULL,                         // защита по умолчанию 
    CONSOLE_TEXTMODE_BUFFER,      // текстовый режим 
    NULL);                        //не используется 
 
                                          //+  
                                          //+  
                                          //+  
                                          //+  
  
  //Проверим, правильно ли создали
  if (hStdOutNew == INVALID_HANDLE_VALUE) 
  {
    printf ("всё плохо\n"); 
    return GetLastError(); 
  }
 
                                          //+  
                                          //+  
                                          //+  
                                          //+  
  printf ("%d\n", SetStdHandle (STD_OUTPUT_HANDLE ,hStdOutNew));
  getchar ();
 
  
  //Если правильно создали делаем активным новый буфер экрана 
  if (!SetConsoleActiveScreenBuffer(hStdOutNew)) 
  { 
    printf ("всё плохо\n"); 
    return GetLastError(); 
  } 
  
  //++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
  
  system ("dir");
  printf ("этой надписи мы никогда не увидим, равно как и вывода dir\n"); 
  
  //Теперь чтобы записать что-то в новый буфер экрана, надо использовать, 
  //например WRiteConsole, где первым параметром идёт буфер экрана
  
  
  getchar ();
  
  return 0; 
}
Добавлено через 20 часов 35 минут
А что, никто не задавался таким вопросом?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.