Форум программистов, компьютерный форум, киберфорум
C++: WinAPI
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.77/13: Рейтинг темы: голосов - 13, средняя оценка - 4.77
быдлокодер
1721 / 908 / 106
Регистрация: 04.06.2008
Сообщений: 5,635
1

Откуда функция AllocConsole() черпает информацию для создания консоли?

02.09.2013, 22:11. Показов 2442. Ответов 7
Метки нет (Все метки)

Друзья! Напомню вам, что если в процессе X мы создадим (CreateProcess()) НЕконсольное приложение Y, должным образом заполнив структуру STARTUPINFO в X, то в этом самом неконсольном приложении Y мы можем создать консоль (AllocConsole()), используя данные STARTUPINFO, которую заполнили в X

Фишка в том, что Y никакого отношения к заполненной структуре STARTUPINFO не имеет (последняя, напомню, заполняется в X). Через командную строку в Y ничего не передаётся. Откуда же в Y (если быть точным, в AllocConsole()) становятся известными цвет фона, цвет текста и прочие прибабмасы консоли?

...Вот два исходника (X и Y). X создаёт Y (X-> Y), а Y создаёт консоль. Хотелось бы услышать ответ на поставленный вопрос и, было бы вообще хорошо увидеть структуру STARTUPINFO в процессе Y. Cпасибо, кто откликнется.

это процесс X
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
#include <windows.h>
#include <iostream>
using namespace std;
 
int main()
{
  char lpszAppName[] = "Y.exe";
 
  STARTUPINFO si;
  PROCESS_INFORMATION pi;
 
  // заполняем поля структуры STARTUPINFO
  ZeroMemory(&si, sizeof(STARTUPINFO));
  si.cb = sizeof(STARTUPINFO);
  si.lpTitle = (LPSTR)"This is a new title";
  si.dwX = 200;            // позиция левого угла окна консоли
  si.dwY = 200;
  si.dwXSize = 200;        // размеры окна
  si.dwYSize = 100;
  si.dwXCountChars = 150;  // размер буфера экрана по горизонтали 
  si.dwYCountChars = 50;   // размер буфера экрана по вертикали
  // красные буквы на синем фоне
  si.dwFillAttribute = FOREGROUND_RED|FOREGROUND_INTENSITY|
  BACKGROUND_BLUE|BACKGROUND_INTENSITY;
  // используем все параметры, что установили
  si.dwFlags = STARTF_USECOUNTCHARS|STARTF_USEFILLATTRIBUTE|
  STARTF_USEPOSITION|STARTF_USESIZE;
  si.wShowWindow = SW_SHOWNORMAL;
 
  // запускаем процесс, который сам распределяет консоль
  if (!CreateProcess(lpszAppName, NULL, NULL, NULL, FALSE,
    DETACHED_PROCESS, NULL, NULL, &si, &pi))
  {
    cout << "The new process is not created." << endl
      << "Check a name of the process." << endl
      << "Press any key to finish." << endl;
    cin.get();
 
    return 0;
  }
  // закрываем дескрипторы процесса
  CloseHandle(pi.hProcess);
  CloseHandle(pi.hThread);
 
  return 0;
}

это процесс Y

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
#include <windows.h>
#include <conio.h>
 
int main()
{
  
 //Хорошо бы здесь увидеть структуру STARTUPINFO, которая 
 //заполнена в процессе X
 
  if (!AllocConsole())
  {
    MessageBox(NULL,
      "Console allocation failed",
      "Ошибка Win32 API",
      MB_OK | MB_ICONINFORMATION
    );
    return 0;
  }
   
  _cputs("I am created.");
  _cputs("\nPress any char to exit.\n");
  _getch();
 
  return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
02.09.2013, 22:11
Ответы с готовыми решениями:

Почему функция printf несовместима с функцией AllocConsole?
То есть ситуация: процесс x создаёт процесс y (x-&gt;y), в y для создания консоли используется функция...

Какой виджет использовать для создания консоли в приложении?
Здравствуй мир! Хочу реализовать вывод информации и сообщений об ошибках в виде консоли, а не в...

SimpleTable - шаблонный класс для создания таблиц в консоли
Я тут сделал небольшой проект на С++, и хотел поделиться с вами, вдруг вам понадобится создавать...

Ищу информацию, для создания небольшого портала на java
Практикуюсь в создании сайтов на java, буду использовать Spring MVC + hibernate , вообще не могу...

7
Модератор
Эксперт по электронике
8485 / 6312 / 854
Регистрация: 14.02.2011
Сообщений: 21,878
02.09.2013, 22:37 2
мдя вопрос конечно интересный
я думаю так
когда ты пишешь простую консольную программку, ты ведь не можешь менять положения окошка, размер
так и здесь ты даешь команду системе, что окошко будет там то, размер такой то и система уже из этих данных , строит окно для другого процесса, сам процесс разумеется никак эти данные получить не может
Это не истина, а так мои размышления, навело меня на них вот это
lpStartupInfo
[in] Указатель на структуру STARTUPINFO, которая устанавливает оконный режим терминала, рабочий стол, стандартные дескрипторы и внешний вид главного окна для нового процесса.
взято от сюда
http://www.vsokovikov.narod.ru... rocess.htm
0
Почетный модератор
Эксперт .NET
8699 / 3651 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
02.09.2013, 22:40 3
Цитата Сообщение от kravam Посмотреть сообщение
Фишка в том, что Y никакого отношения к заполненной структуре STARTUPINFO не имеет
Как это не имеет? Эта структура отвечает за значения по-умолчанию применяемые к создаваемому главному окну процесса.
Она сохраняется в созданном процессе в структуре _RTL_USER_PROCESS_PARAMETERS, указатель на которую находится в PEB по смещению 0x10 для x86 процессов.

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
ntdll!_RTL_USER_PROCESS_PARAMETERS
   +0x000 MaximumLength    : Uint4B
   +0x004 Length           : Uint4B
   +0x008 Flags            : Uint4B
   +0x00c DebugFlags       : Uint4B
   +0x010 ConsoleHandle    : Ptr32 Void
   +0x014 ConsoleFlags     : Uint4B
   +0x018 StandardInput    : Ptr32 Void
   +0x01c StandardOutput   : Ptr32 Void
   +0x020 StandardError    : Ptr32 Void
   +0x024 CurrentDirectory : _CURDIR
   +0x030 DllPath          : _UNICODE_STRING
   +0x038 ImagePathName    : _UNICODE_STRING
   +0x040 CommandLine      : _UNICODE_STRING
   +0x048 Environment      : Ptr32 Void
   +0x04c StartingX        : Uint4B
   +0x050 StartingY        : Uint4B
   +0x054 CountX           : Uint4B
   +0x058 CountY           : Uint4B
   +0x05c CountCharsX      : Uint4B
   +0x060 CountCharsY      : Uint4B
   +0x064 FillAttribute    : Uint4B    // dwFillAttribute 
   +0x068 WindowFlags      : Uint4B    // dwFlags
   +0x06c ShowWindowFlags  : Uint4B
   +0x070 WindowTitle      : _UNICODE_STRING
   +0x078 DesktopInfo      : _UNICODE_STRING
   +0x080 ShellInfo        : _UNICODE_STRING
   +0x088 RuntimeData      : _UNICODE_STRING
   +0x090 CurrentDirectores : [32] _RTL_DRIVE_LETTER_CURDIR
   +0x290 EnvironmentSize  : Uint4B
   +0x294 EnvironmentVersion : Uint4B
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
ntdll!_PEB
   +0x000 InheritedAddressSpace : UChar
   +0x001 ReadImageFileExecOptions : UChar
   +0x002 BeingDebugged    : UChar
   +0x003 BitField         : UChar
   +0x003 ImageUsesLargePages : Pos 0, 1 Bit
   +0x003 IsProtectedProcess : Pos 1, 1 Bit
   +0x003 IsLegacyProcess  : Pos 2, 1 Bit
   +0x003 IsImageDynamicallyRelocated : Pos 3, 1 Bit
   +0x003 SkipPatchingUser32Forwarders : Pos 4, 1 Bit
   +0x003 SpareBits        : Pos 5, 3 Bits
   +0x004 Mutant           : Ptr32 Void
   +0x008 ImageBaseAddress : Ptr32 Void
   +0x00c Ldr              : Ptr32 _PEB_LDR_DATA
   // адрес _RTL_USER_PROCESS_PARAMETERS
   +0x010 ProcessParameters : Ptr32 _RTL_USER_PROCESS_PARAMETERS
   +0x014 SubSystemData    : Ptr32 Void
   +0x018 ProcessHeap      : Ptr32 Void
1
Модератор
Эксперт по электронике
8485 / 6312 / 854
Регистрация: 14.02.2011
Сообщений: 21,878
02.09.2013, 22:45 4
Цитата Сообщение от NickoTin Посмотреть сообщение
Как это не имеет? Эта структура отвечает за значения по-умолчанию применяемые к создаваемому главному окну процесса.
но я правильно понял, что это уже епархия системы, а не приложения?
0
Почетный модератор
Эксперт .NET
8699 / 3651 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
02.09.2013, 22:53 5
ValeryS, не совсем понял вопрос, система использует эти параметры только в том случае если при первом создании окна (CreateWindowEx) используются значения по умолчанию, как например когда создается окно и значение параметра nWidth функции CreateWindow равно CW_USEDEFAULT, тогда система возьмет значение из поля CountX структуры RTL_USER_PROCESS_PARAMETERS. Об это написано в описании структуры STARTUPINFO, только не вдаваясь в подробности где и что.
0
Модератор
Эксперт по электронике
8485 / 6312 / 854
Регистрация: 14.02.2011
Сообщений: 21,878
02.09.2013, 23:03 6
Цитата Сообщение от NickoTin Посмотреть сообщение
ValeryS, не совсем понял вопрос, система использует эти параметры только в том случае если при первом создании окна (CreateWindowEx) используются значения по умолчанию,
я имею ввиду что заполнив эту структуру, даешь команду системе создать окно там-то и там-то
а приложение, у ТС "процесс Y", к эти данным вообще не имеет отношение?
Цитата Сообщение от NickoTin Посмотреть сообщение
функции CreateWindow равно CW_USEDEFAULT,
здесь как бы понятно, но у ТС создается консоль и окно, в данном случае консольное, создает система
0
Почетный модератор
Эксперт .NET
8699 / 3651 / 404
Регистрация: 14.06.2010
Сообщений: 4,513
Записей в блоге: 9
02.09.2013, 23:25 7
Цитата Сообщение от ValeryS Посмотреть сообщение
я имею ввиду что заполнив эту структуру, даешь команду системе создать окно там-то и там-то
Если используются значения по-умолчанию, то да, иначе будут использованы те которые заданы.
Цитата Сообщение от ValeryS Посмотреть сообщение
а приложение, у ТС "процесс Y", к эти данным вообще не имеет отношение?
Как не имеет, Вы их можете получить вызвав GetStartupInfo.
Кажись понял наконец вопрос, нет не имеет, их задает создающий процесс.
Цитата Сообщение от ValeryS Посмотреть сообщение
но у ТС создается консоль и окно, в данном случае консольное, создает система
Да.
1
ValeryS
02.09.2013, 23:29     Откуда функция AllocConsole() черпает информацию для создания консоли?
  #8

Не по теме:

NickoTin,
есть много, друг Горацио, не свете...

0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
02.09.2013, 23:29

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Возможно ли, работая в консоли хрома, сохранять информацию, помимо логов консоли (console.log), куда-нибудь ещё?
Всем, привет :) Подскажите пожалуйста, возможно ли на js, работая в консоли хрома, сохранять...

Откуда брать информацию?
Добрый день! сегодня хотел установить воедпресс на локальном сервере, и вот откуда я должен...

функция для создания прямоугольника
Помогите допилить функцию для создания прямоугольника с шириной, высотой и цветом &lt;!DOCTYPE...

Функция для создания иерархии каталогов
Есть ли в С++ функция для создания списка вложенных папок, например path=&quot;my\\my1\\my2&quot; (аналог...


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

Или воспользуйтесь поиском по форуму:
8
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.