Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
1 / 1 / 0
Регистрация: 22.03.2011
Сообщений: 56

Написать GUI для консольного приложения

13.12.2015, 09:27. Показов 2477. Ответов 19
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Доброго времени суток всем. Имеется консольное приложение, хочу присобачить к нему GUI, но в виде именно отдельной программы, собственно вопрос:
1. Как считывать вывод консольного приложения?
2. Как передавать команды на ввод консольному приложению?
3. Как запустить его из GUI скрытым?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
13.12.2015, 09:27
Ответы с готовыми решениями:

Как создать программу (экзешник) с GUI на основе кода консольного приложения?
Народ как создать программу если есть код С++ ? Хочу создать программу с окнами ! тип (exe) приложение! Есть исходный код в С++ Программа...

Иконка для консольного приложения
Всем привет !! Возник такой вопрос можно ли консольной программе дать иконку которую ты хочешь а не скучную стандартную . если да то как ?

Команды для консольного приложения
Пишу на С++. Нужно создать консольное приложение. Со своими командами. Мне просто хочется понять, как что-то подобное этому: sudo...

19
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
13.12.2015, 10:31
А для чего такие сложности? Сделай единое приложение.
0
1 / 1 / 0
Регистрация: 22.03.2011
Сообщений: 56
14.12.2015, 01:59  [ТС]
Окей, решил покопаться и объединить это всё в одно, возник такой вопрос:
Вызываю форму с помощью:
C++
1
ChooseFrm->ShowDialog();
Ответ проверяю так:
C++
1
2
3
4
5
6
7
8
    if(ChooseFrm->ShowDialog() == mrOk)
            {
                in = ChooseFrm->comboBox1->SelectedIndex;
            }
            else if(ChooseFrm->ShowDialog() == mrCancel)
            {
 
            }
И получаю вот такую ошибку:
Code
1
2
Ошибка    7   error C2065: mrOk: необъявленный идентификатор    
Ошибка    8   error C2065: mrCancel: необъявленный идентификатор
В чем мой косяк?

Добавлено через 6 минут
MSDN Показал мой косяк, теперь косяк от MSDN. Переделал согласно примеру:
C++
1
2
3
4
5
6
7
8
9
ChooseFrm->ShowDialog();
            if(ChooseFrm->ShowDialog( this ) == ::DialogResult::OK)
            {
                in = ChooseFrm->comboBox1->SelectedIndex;
            }
            else if(ChooseFrm->ShowDialog( this ) == ::DialogResult::Cancel)
            {
 
            }
Получил в два раза больше ошибок:
Code
1
2
3
4
5
Ошибка    8   error C2039: OK: не является членом "`global namespace'"    
Ошибка    9   error C2065: OK: необъявленный идентификатор  c:\users\superman\desktop\cwm\signscanner\signscanner\Form1.h   435
Ошибка    10  error C3083: DialogResult: символ слева от "::" должен представлять тип   
Ошибка    11  error C2039: Cancel: не является членом "`global namespace'"    
Ошибка    12  error C2065: Cancel: необъявленный идентификатор
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
14.12.2015, 09:28
C++
1
System::Windows::Forms::DialogResult::OK
1
1 / 1 / 0
Регистрация: 22.03.2011
Сообщений: 56
15.12.2015, 01:27  [ТС]
Простите уже, что спамлю в тему с другим названием, но создавать из-за каждой проблемы новую тему, было бы как по мне - некорректней.

Проблема следующая, есть основная форма [Form1.h] к ней подключен заголовочный файл Sniffer.h, мне необходимо из заголовочного файла Sniffer.h обращаться к функции реализованной в Form1.h, как это делать?

Пробовал просто подключить её в заголовок Sniffer.h, получаю вот такие вот непонятные ошибки:
Code
1
2
3
Ошибка    9   error LNK2028: ссылка на неразрешенную лексему (0A000075) "int __clrcall checker(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?checker@@$$FYMHV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) в функции "void __clrcall PrintData(char *,int)" (?PrintData@@$$FYMXPADH@Z)   C:\Users\Superman\Desktop\CWM\SignScanner\SignScanner\SignScanner.obj
Ошибка    10  error LNK2019: ссылка на неразрешенный внешний символ "int __clrcall checker(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?checker@@$$FYMHV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) в функции "void __clrcall PrintData(char *,int)" (?PrintData@@$$FYMXPADH@Z) C:\Users\Superman\Desktop\CWM\SignScanner\SignScanner\SignScanner.obj
Ошибка    11  error LNK1120: 2 неразрешенных внешних элементов   C:\Users\Superman\Desktop\CWM\SignScanner\Release\SignScanner.exe   1

Функция checker реализованная в Form1.h вызывается из функции PrintData реализованной в Sniffer.h.

Добавлено через 2 часа 14 минут
Up!
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
15.12.2015, 12:14
Ты как-то неправильно организуешь взаимодействие. Функции формы должны вызывать функции из твоего самодельного модуля, а не наоборот. Ну или если там функций не много, сделай их членами класса формы.
1
1 / 1 / 0
Регистрация: 22.03.2011
Сообщений: 56
15.12.2015, 16:32  [ТС]
Ок, некст question.

Есть некоторая функция, которая меняет значение поля label1 в Form1. Проблема с отрисовкой(значение визуально не меняется),
C++
1
Application::DoEvents();
не помогает.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
15.12.2015, 17:51
Вообще не меняется или именно в этой функции? Она управление возвращает?
0
1 / 1 / 0
Регистрация: 22.03.2011
Сообщений: 56
21.12.2015, 12:46  [ТС]
Именно в этой функции. Про возврат управления - не очень понял, что он из себя представляет. Могу привести код.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
21.12.2015, 13:37
Ну т. е. функция быстро завершается или долго работает?
0
1 / 1 / 0
Регистрация: 22.03.2011
Сообщений: 56
21.12.2015, 17:24  [ТС]
Как по мне - быстро)


Form1.h - основная форма.
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
#pragma once
#include "Settings.h"
#include "Sniffer.h"
#include "Choose.h"
using namespace std;
 
//куча кода
 
 
private: System::Void backgroundWorker2_DoWork(System::Object^  sender, System::ComponentModel::DoWorkEventArgs^  e) {
            //куча кода
 
            richTextBox1->Text += "Setting socket to sniff...\n";
            if (WSAIoctl(sniffer, SIO_RCVALL, &j, sizeof(j), 0, 0, (LPDWORD)&in, 0, 0) == SOCKET_ERROR)
                {
                    printf("WSAIoctl() failed.\n");
                }
            richTextBox1->Text += "Socket set.\n";
 
            //Begin
            richTextBox1->Text += "Started Sniffing\n";
            richTextBox1->Text += "Packet Capture Statistics...\n";
            StartSniffing(sniffer); //вызываем функцию описанную в Sniffer.h
 
            //End
            closesocket(sniffer);
            WSACleanup();
 
         
         
         
         
         }

Sniffer.h
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
#pragma once
#include "stdafx.h"
#include <sstream>
 
 
#include "stdio.h"
#include "winsock2.h"
#include "Form1.h"
 
//куча функций из которых мы приходим в конце к функции PrintData
 
void PrintData(char* data, int Size)
{
 
    using namespace std;
    char a, line[17], c;
    int j;
    stringstream dataline;
    
 
    //loop over each character and print
    for (i = 0; i < Size; i++)
    {
 
        dataline << std::hex << (unsigned char)data[i];
        //c = data[i];
 
        //Print the hex value for every character , with a space. Important to make unsigned
        //fprintf(logfile, "%.2x", (unsigned char)c);
 
        //Add the character to data line. Important to make unsigned
        //a = (c >= 32 && c <= 128) ? (unsigned char)c : '.';
 
        //ine[i % 16] = a;
 
        //if last character of a line , then print the line - 16 characters in 1 line
        //if ((i != 0 && (i + 1) % 16 == 0) || i == Size - 1)
        //{
            //line[i % 16 + 1] = '\0';
 
            //print a big gap of 10 characters between hex and characters
            //fprintf(logfile, "          ");
 
            //Print additional spaces for last lines which might be less than 16 characters in length
            //for (j = strlen(line); j < 16; j++)
            //{
            //  fprintf(logfile, "   ");
            //}
 
            //fprintf(logfile, "%s \n", line);
        //}
    }
    string mystr = dataline.str();
 
 
 
        //функция checker описана в SignScanner.cpp
    if (checker(mystr) == 1)
    {
            fprintf(logfile, "Data Payload:\n");
            for (i = 0; i < Size; i++)
                {
                    c = data[i];
                    fprintf(logfile, "%.2x", (unsigned char)c);
                    //Add the character to data line. Important to make unsigned
                    a = (c >= 32 && c <= 128) ? (unsigned char)c : '.';
 
                    line[i % 16] = a;
 
                    //if last character of a line , then print the line - 16 characters in 1 line
                    if ((i != 0 && (i + 1) % 16 == 0) || i == Size - 1)
                    {
                        line[i % 16 + 1] = '\0';
 
                        //print a big gap of 10 characters between hex and characters
                        fprintf(logfile, "          ");
 
                        //Print additional spaces for last lines which might be less than 16 characters in length
                        for (j = strlen(line); j < 16; j++)
                        {
                            fprintf(logfile, "   ");
                        }
 
                        fprintf(logfile, "%s \n", line);
                        }
            }
 
        //fprintf(logfile, mystr);
    }
    
    const char *caw = mystr.c_str();
    fprintf(logfile, caw);
}

SignScanner.cpp - отсюда то мы и меняем текст в форме.
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
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
// SignScanner.cpp : main project file.
 
#pragma once
#include "stdafx.h"
#include "Form1.h"
#include "Windows.h"
 
using namespace SignScanner;
 
HWND hWnd;
 
[STAThreadAttribute]
int main(array<System::String ^> ^args)
{
    // Enabling Windows XP visual effects before any controls are created
    Application::EnableVisualStyles();
    Application::SetCompatibleTextRenderingDefault(false); 
 
    // Create the main window and run it
    Application::Run(gcnew Form1());
    return 0;
}
 
 
bool checker(std::string dataline) 
         {
             Form1^ f=gcnew Form1();
 
              String^ str2 = gcnew String(dataline.c_str());
 
             using namespace std;
             f->richTextBox1->Text = str2;
             int vs=0; //счетчик угроз 
             string sign;
             Sleep(f->sleep_time); //интервал сканирования
             ifstream signfile ("sign.txt");  //открываем файл с сигнатурами
             if (signfile.is_open())  //если вышло окрыть
             {
                 while ( signfile.good() )
                 {
                     getline (signfile,sign);
 
                     //--------------------------------------------------------------------------------------------
                     //открываем файл с логом
                      size_t found = dataline.find(sign);
                                 if (found!=std::string::npos)
                                        {                   //если угроза найдена (т.е. совпадение сигнатуры есть) - добавляем счетчик угроз
                                                vs++;
                                        }
 
                    /* string line;
                     ifstream log("log.txt"); //открываем файл с логами
                     if (log.is_open())  //если вышло открыть
                     {
                         while ( log.good() )
                         {
                             getline (log,line);
                             size_t found=line.find("Data: ");
                             if (found!=std::string::npos) 
                             {
                                 size_t found = line.find(sign);
                                 if (found!=std::string::npos) //если угроза найдена (т.е. совпадение сигнатуры есть) - добавляем счетчик угроз
                                    vs++;
                                 return 1;
                             }
                         }
                         log.close();*/
                     }
                     //--------------------------------------------------------------------------------------------
              }
                 signfile.close();
 
                 if (vs == 0)
                        {
                             f->label2->Text = "Обнаружено угроз: нет угроз";
                             f->pictureBox1->ImageLocation = "pic/allok.png";
                             f->pictureBox1->Refresh();
                             return 0;
                             //pictureBox2->Image = "";
                        }
                 else
                        {
                             f->label2->Text = "Обнаружено угроз: " +  vs;
                             f->pictureBox1->ImageLocation = "pic/virus.png";
                             f->pictureBox1->Refresh();
                             //pictureBox2->Image = "";
                             return 1;
                        }
                 //button1->Enabled = true;
         }
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
21.12.2015, 17:30
Сколько у тебя форм? Две, что ли? Одна в main(), другая в checker()? И обе одного класса?
0
1 / 1 / 0
Регистрация: 22.03.2011
Сообщений: 56
21.12.2015, 17:47  [ТС]
Форма одна. Думаю проще будет кинуть проект.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
21.12.2015, 18:15
Лучший ответ Сообщение было отмечено stal_in как решение

Решение

В checker() ты создаёшь какую-то вторую форму, а надо пользоваться первой.
1
1 / 1 / 0
Регистрация: 22.03.2011
Сообщений: 56
21.12.2015, 21:47  [ТС]
А можете чуть больше конкретизировать мои действия?) Как именно мне ссылать на Form1?

Добавлено через 27 минут
Мне всего-то надо менять текст в richTextBox, а я уже мозг взорвал. =(
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
22.12.2015, 14:24
Сделай функцию членом класса формы, если это не мешает. Тогда он будет видеть все элементы формы.
0
1 / 1 / 0
Регистрация: 22.03.2011
Сообщений: 56
22.12.2015, 16:21  [ТС]
А в таком случае, я получаю ошибки:
Code
1
2
3
Ошибка    4   error LNK2028: ссылка на неразрешенную лексему (0A000074) "bool __clrcall checker(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?checker@@$$FYM_NV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) в функции "void __clrcall PrintData(char *,int)" (?PrintData@@$$FYMXPADH@Z) C:\Users\Superman\Desktop\CWM\SignScanner\SignScanner\SignScanner.obj
Ошибка    5   error LNK2019: ссылка на неразрешенный внешний символ "bool __clrcall checker(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> >)" (?checker@@$$FYM_NV?$basic_string@DU?$char_traits@D@std@@V?$allocator@D@2@@std@@@Z) в функции "void __clrcall PrintData(char *,int)" (?PrintData@@$$FYMXPADH@Z)   C:\Users\Superman\Desktop\CWM\SignScanner\SignScanner\SignScanner.obj
Ошибка    6   error LNK1120: 2 неразрешенных внешних элементов   C:\Users\Superman\Desktop\CWM\SignScanner\Release\SignScanner.exe
Добавлено через 11 минут
В checker() ты создаёшь какую-то вторую форму, а надо пользоваться первой.
А разве это не указатель на форму1:
C++
1
Form1^ f=gcnew Form1();
Просто я попробовал интереса ради, дальше дать f->Show() в цикле и у меня зависла форма1.
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
22.12.2015, 16:45
Ну у тебя все функции, которые взаимодействуют с формой или вызывают те, которые взаимодействуют, должны быть членами класса.
Цитата Сообщение от stal_in Посмотреть сообщение
А разве это не указатель на форму1
Это указатель, но не на ту форму, которая у тебя главная, а на какой-то другой экземпляр.
0
1 / 1 / 0
Регистрация: 22.03.2011
Сообщений: 56
22.12.2015, 17:08  [ТС]
Цитата Сообщение от nmcf Посмотреть сообщение
Это указатель, но не на ту форму, которая у тебя главная, а на какой-то другой экземпляр.
А как сделать на главную?
0
7804 / 6568 / 2988
Регистрация: 14.04.2014
Сообщений: 28,705
22.12.2015, 18:16
Лучший ответ Сообщение было отмечено stal_in как решение

Решение

Все функции, которые взаимодействуют с формой, сделать членами класса формы, тогда им не нужен указатель.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.12.2015, 18:16
Помогаю со студенческими работами здесь

Иконка для консольного приложения
Я хочу установить иконку к своему консольному приложению, работаю в Code Blocks. Я долго искал информацию на эту тему в интернете, но найти...

Таймер для консольного приложения
Добрый день, подскажите как реализовать таймер в консольном приложение. Таймер нужен для ожидания нажатия клавиши, если ничего не нажали то...

Параметры для запуска консольного приложения
Доброго времени суток!) У некоторых исполняемых файлов вроде того же shutdown.exe есть параметры для запуска вроде ...

He1p или /? для консольного приложения
Собственно, как? Или просто нужно принять параметры, отследить, что это /? и соответственно ответить? Добавлено через 1 час 14 минут ...

Написать программу, которая по выбору пользователя меняет цвет консольного приложения. Пользователь выбирает шрифт и фон
нужно использовать оператор if, else if Добавлено через 44 секунды Помогите пожалуйста!


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Символьное дифференцирование
igorrr37 13.02.2026
/ * Логарифм записывается как: (x-2)log(x^2+2) - означает логарифм (x^2+2) по основанию (x-2). Унарный минус обозначается как ! в-строка - входное арифметическое выражение в инфиксной(обычной). . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL3_image
8Observer8 10.02.2026
Содержание блога Библиотека SDL3_image содержит инструменты для расширенной работы с изображениями. Пошагово создадим проект для загрузки изображения формата PNG с альфа-каналом (с прозрачным. . .
Установка Qt-версии Lazarus IDE в Debian Trixie Xfce
volvo 10.02.2026
В общем, достали меня глюки IDE Лазаруса, собранной с использованием набора виджетов Gtk2 (конкретно: если набирать текст в редакторе и вызвать подсказку через Ctrl+Space, то после закрытия окошка. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru