Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
kravam
быдлокодер
 Аватар для kravam
1513 / 873 / 44
Регистрация: 04.06.2008
Сообщений: 5,266
05.09.2013, 19:30     Если каждого консольного процесса существует свой дескриптор буфер экрана, то где именно он находится? #1
То есть фишка в чём: если мы создадим консольный процесс, а потом ИЗМЕНИМ буфер экрана и сделаем его активным, то чёрта с два мы туда что-нибудь запишем общеизвестными функциям, например 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 минут
А что, никто не задавался таким вопросом?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.09.2013, 19:30     Если каждого консольного процесса существует свой дескриптор буфер экрана, то где именно он находится?
Посмотрите здесь:

вылазит ошибка, в строчке нужно исправить, где именно? C++
Как сделать так, что если файл существует return true, если нет - return false C++
Как сделать для каждого представления свой ControlBar C++
Получить цвет фона экрана консольного окна (можно и методами WinAPI) C++
Как открыть файл на чтение и запись, создав его, если его не существует, и перезаписать, если он существует? C++
C++ Свой деструктор для каждого класса в массиве
C++ Расставить между словами пробелы - как определить, где именно поставить пробел
Приведите пример, как можно связать знания консольного C++ (где алгоритмы, структуры, массивы) с WinAPI? C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

Текущее время: 06:15. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru