Anonymous
Создать новую консоль из консольного приложения? С++
Сообщение
Anonymous » 30 окт 2025, 05:39
Я застрял при создании нового консольного окна для моего консольного приложения для регистратора. Этот код отлично работает для приложений с графическим интерфейсом, но не работает для консоли, и для них требуется: функция CreateProcess с флагом DETACHED_PROCESS.
Код: Выделить всё
Logger Log;
DWORD PiD;
void __stdcall LoggerCore(PVOID pVoid)
{
AllocConsole();
while(true)
{
SetConsoleTitleA(Log.LoggerTittle());
Sleep(5000);
}
_endthread();
}
char* Logger::LoggerTittle()
{
static char Tittle[55];
sprintf(Tittle, "Debug Logger");
return Tittle;
}
void Logger::LoggerInit()
{
CreateThread( 0 , 0 , (LPTHREAD_START_ROUTINE) LoggerCore , 0 , 0 , &PiD );
}
И этот код создает новую консоль, когда приложение имеет графический интерфейс, и отображает «Log.ConsoleOutPut(1, c_Green,t_Default,»Debug Logger: SomeInfo»);» в новом окне консоли. Но все это не работает для консольного приложения. Итак, как я могу создать второе консольное окно в консольном приложении с помощью CreateProcess? Спасибо за совет!
Итак, я пытаюсь переписать его, но ничего... у меня это не работает.
Код: Выделить всё
#include logger.h
char Message[1024];
Logger Log;
DWORD PiD;
/*
void __stdcall LoggerCore(PVOID pVoid)
{
AllocConsole();
while(true)
{
SetConsoleTitleA(Log.LoggerTittle());
Sleep(5000);
}
_endthread();
}
char* Logger::LoggerTittle()
{
static char Tittle[55];
sprintf(Tittle, "Debug Logger");
return Tittle;
}
*/
void Logger::LoggerInit()
{
SECURITY_ATTRIBUTES sa;
sa.nLength=sizeof(SECURITY_ATTRIBUTES);
sa.bInheritHandle=1;
sa.lpSecurityDescriptor=0;
SetHandleInformation(this->near_end,HANDLE_FLAG_INHERIT,0);
PROCESS_INFORMATION pi;
STARTUPINFO si;
ZeroMemory(&pi,sizeof(pi));
ZeroMemory(&si,sizeof(si));
si.cb=sizeof(STARTUPINFO);
si.dwFlags|=STARTF_USESTDHANDLES;
TCHAR program[]=TEXT("???");//need type something here.
TCHAR arguments[100];
if (!CreateProcess(program,arguments,0,0,1,CREATE_NEW_CONSOLE,0,0,&si,&pi))
printf( "CreateProcess failed (%d).\n", GetLastError() );
return;
// Wait until child process exits.
WaitForSingleObject( pi.hProcess, INFINITE );
this->process=pi.hProcess;
CloseHandle(pi.hThread);
// CreateThread( 0 , 0 , (LPTHREAD_START_ROUTINE) LoggerCore , 0 , 0 , &PiD );
}
void Logger::CheckProcent(char* message)
{
for (UINT i = 0; i = i; j--)
message[j+1] = message[j];
i++;
}
}
}
void Logger::ConsoleOutPut(int WOL, sColor Color, sLogType Type, const char* Format, ...)
{
SYSTEMTIME t;
GetLocalTime(&t);
DWORD dwBytesWritten;
HANDLE Handle = GetStdHandle(STD_OUTPUT_HANDLE);
HANDLE hStdin;
hStdin = GetStdHandle(STD_INPUT_HANDLE);
if (hStdin == INVALID_HANDLE_VALUE)
ExitProcess(1);
va_list pArguments;
va_start(pArguments, Format);
sprintf(Message,Format, pArguments);
CheckProcent(Message); // "%" Bug Fix
va_end(pArguments);
char currdate[11] = {0};
char outputmsg[2048];
if(WOL == 1)
{
sprintf(currdate, "(%02d:%02d:%02d)", t.wHour, t.wMinute, t.wSecond);
sprintf(outputmsg,"%s %s\n", currdate,Message);
}
else
sprintf(outputmsg,"%s\n", Message);
switch(Color)
{
case c_BoldGreen:
SetConsoleTextAttribute(this->Handle(FALSE),FOREGROUND_GREEN | FOREGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_INTENSITY);
break;
case c_BoldRed:
SetConsoleTextAttribute(this->Handle(FALSE),FOREGROUND_GREEN | FOREGROUND_INTENSITY | BACKGROUND_RED );
break;
case c_Red:
SetConsoleTextAttribute(this->Handle(FALSE),FOREGROUND_RED | FOREGROUND_INTENSITY);
break;
case c_Green:
SetConsoleTextAttribute(this->Handle(FALSE),FOREGROUND_GREEN | FOREGROUND_INTENSITY);
break;
case c_Blue:
SetConsoleTextAttribute(this->Handle(FALSE),FOREGROUND_BLUE | FOREGROUND_INTENSITY);
break;
case c_Cyan:
SetConsoleTextAttribute(this->Handle(FALSE),FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
break;
case c_Yellow:
SetConsoleTextAttribute(this->Handle(FALSE),FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY);
break;
case c_Magenta:
SetConsoleTextAttribute(this->Handle(FALSE),FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY);
break;
case c_Grey:
SetConsoleTextAttribute(this->Handle(FALSE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY);
break;
}
CreateLog(Type,outputmsg);
WriteFile(this->Handle(FALSE), outputmsg, strlen(outputmsg), &dwBytesWritten, NULL);
SetConsoleTextAttribute(this->Handle(FALSE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE);
return;
}
HANDLE Logger::Handle(BOOL Input)
{
if(Input==TRUE)
return GetStdHandle(STD_INPUT_HANDLE);
else
return GetStdHandle(STD_OUTPUT_HANDLE);
}
void Logger::CreateLog(sLogType Type,const char* Format, ...)
{
SYSTEMTIME now;
GetLocalTime(&now);
char ConsoleLog[55];
char CommandsLog[55];
char ErrorLog[55];
char Date[55];
char SqlLog[55];
char TestLog[55];
sprintf(Date, ".\\Logger\\%02d-%02d-%02d\\", now.wDay, now.wMonth, now.wYear);
CreateDirectory(Date,NULL);
sprintf(CommandsLog, ".\\Logger\\%02d-%02d-%02d\\Commands.log", now.wDay, now.wMonth, now.wYear);
sprintf(ConsoleLog, ".\\Logger\\%02d-%02d-%02d\\CONSOLE.log", now.wDay, now.wMonth, now.wYear);
sprintf(ErrorLog, ".\\Logger\\%02d-%02d-%02d\\Error.log", now.wDay, now.wMonth, now.wYear);
sprintf(SqlLog, ".\\Logger\\%02d-%02d-%02d\\Sql.log", now.wDay, now.wMonth, now.wYear);
sprintf(TestLog, ".\\Logger\\%02d-%02d-%02d\\Test.log", now.wDay, now.wMonth, now.wYear);
va_list pArguments1;
va_start(pArguments1, Format);
sprintf(Message,Format, pArguments1);
va_end(pArguments1);
switch (Type)
{
case t_NULL:
break;
case t_Error:
{
SaveFile(ErrorLog, Message);
}
break;
case t_Default:
{
SaveFile(ConsoleLog,Message);
}
break;
case t_COMMANDS:
{
SaveFile(ConsoleLog,Message);
SaveFile(CommandsLog,Message);
}
break;
case t_SQL:
{
SaveFile(ConsoleLog,Message);
SaveFile(SqlLog,Message);
}
break;
case t_TEST:
{
SaveFile(TestLog,Message);
}
break;
}
}
void Logger::SaveFile(char *logString,char *Message)
{
FILE *stream;
stream=fopen(logString, "a+" );
fprintf(stream, "%s", Message);
fclose(stream);
}
Итак, теперь моя проблема: сбой CreateProcess , и когда я установлен TCHAR program[]=TEXT("application.exe"); - они запускают много копий этой программы, когда мне присвоено значение NULL - они возвращают мне ошибку ... И отправляют журналы в главное окно консоли (окно приложения).
Подробнее здесь:
https://stackoverflow.com/questions/187 ... sole-app-c
1761791940
Anonymous
Я застрял при создании нового консольного окна для моего консольного приложения для регистратора. Этот код отлично работает для приложений с графическим интерфейсом, но не работает для консоли, и для них требуется: функция CreateProcess с флагом DETACHED_PROCESS. [code]Logger Log; DWORD PiD; void __stdcall LoggerCore(PVOID pVoid) { AllocConsole(); while(true) { SetConsoleTitleA(Log.LoggerTittle()); Sleep(5000); } _endthread(); } char* Logger::LoggerTittle() { static char Tittle[55]; sprintf(Tittle, "Debug Logger"); return Tittle; } void Logger::LoggerInit() { CreateThread( 0 , 0 , (LPTHREAD_START_ROUTINE) LoggerCore , 0 , 0 , &PiD ); } [/code] И этот код создает новую консоль, когда приложение имеет графический интерфейс, и отображает «Log.ConsoleOutPut(1, c_Green,t_Default,»Debug Logger: SomeInfo»);» в новом окне консоли. Но все это не работает для консольного приложения. Итак, как я могу создать второе консольное окно в консольном приложении с помощью CreateProcess? Спасибо за совет! Итак, я пытаюсь переписать его, но ничего... у меня это не работает. [code]#include logger.h char Message[1024]; Logger Log; DWORD PiD; /* void __stdcall LoggerCore(PVOID pVoid) { AllocConsole(); while(true) { SetConsoleTitleA(Log.LoggerTittle()); Sleep(5000); } _endthread(); } char* Logger::LoggerTittle() { static char Tittle[55]; sprintf(Tittle, "Debug Logger"); return Tittle; } */ void Logger::LoggerInit() { SECURITY_ATTRIBUTES sa; sa.nLength=sizeof(SECURITY_ATTRIBUTES); sa.bInheritHandle=1; sa.lpSecurityDescriptor=0; SetHandleInformation(this->near_end,HANDLE_FLAG_INHERIT,0); PROCESS_INFORMATION pi; STARTUPINFO si; ZeroMemory(&pi,sizeof(pi)); ZeroMemory(&si,sizeof(si)); si.cb=sizeof(STARTUPINFO); si.dwFlags|=STARTF_USESTDHANDLES; TCHAR program[]=TEXT("???");//need type something here. TCHAR arguments[100]; if (!CreateProcess(program,arguments,0,0,1,CREATE_NEW_CONSOLE,0,0,&si,&pi)) printf( "CreateProcess failed (%d).\n", GetLastError() ); return; // Wait until child process exits. WaitForSingleObject( pi.hProcess, INFINITE ); this->process=pi.hProcess; CloseHandle(pi.hThread); // CreateThread( 0 , 0 , (LPTHREAD_START_ROUTINE) LoggerCore , 0 , 0 , &PiD ); } void Logger::CheckProcent(char* message) { for (UINT i = 0; i = i; j--) message[j+1] = message[j]; i++; } } } void Logger::ConsoleOutPut(int WOL, sColor Color, sLogType Type, const char* Format, ...) { SYSTEMTIME t; GetLocalTime(&t); DWORD dwBytesWritten; HANDLE Handle = GetStdHandle(STD_OUTPUT_HANDLE); HANDLE hStdin; hStdin = GetStdHandle(STD_INPUT_HANDLE); if (hStdin == INVALID_HANDLE_VALUE) ExitProcess(1); va_list pArguments; va_start(pArguments, Format); sprintf(Message,Format, pArguments); CheckProcent(Message); // "%" Bug Fix va_end(pArguments); char currdate[11] = {0}; char outputmsg[2048]; if(WOL == 1) { sprintf(currdate, "(%02d:%02d:%02d)", t.wHour, t.wMinute, t.wSecond); sprintf(outputmsg,"%s %s\n", currdate,Message); } else sprintf(outputmsg,"%s\n", Message); switch(Color) { case c_BoldGreen: SetConsoleTextAttribute(this->Handle(FALSE),FOREGROUND_GREEN | FOREGROUND_INTENSITY | BACKGROUND_RED | BACKGROUND_INTENSITY); break; case c_BoldRed: SetConsoleTextAttribute(this->Handle(FALSE),FOREGROUND_GREEN | FOREGROUND_INTENSITY | BACKGROUND_RED ); break; case c_Red: SetConsoleTextAttribute(this->Handle(FALSE),FOREGROUND_RED | FOREGROUND_INTENSITY); break; case c_Green: SetConsoleTextAttribute(this->Handle(FALSE),FOREGROUND_GREEN | FOREGROUND_INTENSITY); break; case c_Blue: SetConsoleTextAttribute(this->Handle(FALSE),FOREGROUND_BLUE | FOREGROUND_INTENSITY); break; case c_Cyan: SetConsoleTextAttribute(this->Handle(FALSE),FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); break; case c_Yellow: SetConsoleTextAttribute(this->Handle(FALSE),FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY); break; case c_Magenta: SetConsoleTextAttribute(this->Handle(FALSE),FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_INTENSITY); break; case c_Grey: SetConsoleTextAttribute(this->Handle(FALSE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY); break; } CreateLog(Type,outputmsg); WriteFile(this->Handle(FALSE), outputmsg, strlen(outputmsg), &dwBytesWritten, NULL); SetConsoleTextAttribute(this->Handle(FALSE), FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); return; } HANDLE Logger::Handle(BOOL Input) { if(Input==TRUE) return GetStdHandle(STD_INPUT_HANDLE); else return GetStdHandle(STD_OUTPUT_HANDLE); } void Logger::CreateLog(sLogType Type,const char* Format, ...) { SYSTEMTIME now; GetLocalTime(&now); char ConsoleLog[55]; char CommandsLog[55]; char ErrorLog[55]; char Date[55]; char SqlLog[55]; char TestLog[55]; sprintf(Date, ".\\Logger\\%02d-%02d-%02d\\", now.wDay, now.wMonth, now.wYear); CreateDirectory(Date,NULL); sprintf(CommandsLog, ".\\Logger\\%02d-%02d-%02d\\Commands.log", now.wDay, now.wMonth, now.wYear); sprintf(ConsoleLog, ".\\Logger\\%02d-%02d-%02d\\CONSOLE.log", now.wDay, now.wMonth, now.wYear); sprintf(ErrorLog, ".\\Logger\\%02d-%02d-%02d\\Error.log", now.wDay, now.wMonth, now.wYear); sprintf(SqlLog, ".\\Logger\\%02d-%02d-%02d\\Sql.log", now.wDay, now.wMonth, now.wYear); sprintf(TestLog, ".\\Logger\\%02d-%02d-%02d\\Test.log", now.wDay, now.wMonth, now.wYear); va_list pArguments1; va_start(pArguments1, Format); sprintf(Message,Format, pArguments1); va_end(pArguments1); switch (Type) { case t_NULL: break; case t_Error: { SaveFile(ErrorLog, Message); } break; case t_Default: { SaveFile(ConsoleLog,Message); } break; case t_COMMANDS: { SaveFile(ConsoleLog,Message); SaveFile(CommandsLog,Message); } break; case t_SQL: { SaveFile(ConsoleLog,Message); SaveFile(SqlLog,Message); } break; case t_TEST: { SaveFile(TestLog,Message); } break; } } void Logger::SaveFile(char *logString,char *Message) { FILE *stream; stream=fopen(logString, "a+" ); fprintf(stream, "%s", Message); fclose(stream); } [/code] Итак, теперь моя проблема: сбой CreateProcess , и когда я установлен TCHAR program[]=TEXT("application.exe"); - они запускают много копий этой программы, когда мне присвоено значение NULL - они возвращают мне ошибку ... И отправляют журналы в главное окно консоли (окно приложения). Подробнее здесь: [url]https://stackoverflow.com/questions/18787124/create-new-console-from-console-app-c[/url]