You are on page 1of 10

Міністерство освіти і науки України

Дніпровський національний університет імені Олеся Гончара


Факультет фізики, електроніки та комп’ютерних систем
Кафедра комп’ютерних та інформаційних технологій

Звіт
До лабораторної роботи № 2
На тему «Вивчення основних команд WinApi,
створення процесів»

Виконав:
Студент групи КС-20-2
Кравченко В.О.
Перевірив:
доц. Дерев’янко О.І.

Дніпро
2021
Мета: Навчитися запускати виконані файли з власних програм.
Вивчити функції, які можна застосовувати для цього. Вивчити основні
WinApi функції, що застосовуються для роботи з процесами.
Хід роботи

1. Відкриваємо Visual Studio та створюємо проект.

Для програми потрібно шаблон проекта під назвою “Пустой проект”.

Рис. 1. Створення проекту


Обираємо назву проекту та папку в якій він буде зберігатися.

Рис. 2. Настройка проекту

У самому проекті треба створити три файли.


I. Laba2.cpp – файл для основної частини програми.
II. Functions.cpp – файл для функцій програми.
III. Laba2.h – файл для заголовків тих самих функцій.

Рис. 3. Оглядач рішень


2. Постановка задачі
Створена програма повинна здійснювати запуск зазначеного виконуваного
файлу. Вибір файлу проводиться користувачем за допомогою стандартного
вікна вибору імені файлу. Програма повинна використати наступні функції:
- System;
- Функцію сімейства _spawn;
- CreateProcess;
- MessageBox;
Також користувач повинен мати можливість змінити наступні атрибути
створеного процесу:
- Пріоритет;
- Робочий каталог;
- Вибір коліру тексту та фону для консолі;

3. Вихідний текст програми розв’язку задачі


Код файлу Laba2.cpp
#include <iostream>
#include <string>
#include <process.h>
#include <cstdlib>
#include <Windows.h>
#include "Laba2.h"

using namespace std;

int main() {
setlocale(LC_ALL, "");
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
string prov;
cout << "Хотите ожидать завершение процесса?\n";
cin >> prov;
system("dir");

if (prov == "нет") {
int msgbox = MessageBox(
NULL,
(LPCWSTR)L"Вы уверены что хотите продолжить без ожидания завершения
процесса?",
(LPCWSTR)L"Еще раз спрашиваю!",
MB_ICONWARNING | MB_YESNO
);

switch (msgbox)
{
case IDYES:
prov = "нет";
break;
case IDNO:
prov = "да";
break;
}
if (prov == "нет") {
cout << "Без ожидания завершения:\n ";
_spawnl(P_OVERLAY, "C:\\cpp\\Project1\\Debug\\Project1.exe", "C:\\
cpp\\Project1\\Debug\\Project1.exe", NULL);

}
}
if (prov == "да") {
cout << "С ожиданием завершения: \n";
_spawnl(P_WAIT, "C:\\cpp\\Project1\\Debug\\Project1.exe", "C:\\cpp\\
Project1\\Debug\\Project1.exe", NULL);
}
else {
cout << "wrong";
}

string args;

int msgboxID = MessageBox(


NULL,
(LPCWSTR)L"Запускаем процесс с атрибутами по умолчанию или нет?",
(LPCWSTR)L"Запуск процесса",
MB_ICONWARNING | MB_YESNO
);

switch (msgboxID)
{
case IDYES:
args = "да";
break;
case IDNO:
args = "нет";
break;
}

STARTUPINFO ci;
PROCESS_INFORMATION pi;
ZeroMemory(&ci, sizeof(STARTUPINFO));
ci.dwFlags = STARTF_USESIZE | STARTF_USEFILLATTRIBUTE;
ZeroMemory(&pi, sizeof(pi));

if (args == "да") {

if (CreateProcess(L"C:\\cpp\\Project1\\Debug\\Project1.exe",NULL,
NULL, NULL, FALSE, NULL, NULL, NULL, &ci, &pi))
{
cout << "\nИдентификатор процесса: " << pi.dwProcessId;
cout << "\nДескриптор процесса:" << pi.hProcess;
cout << "Процесс запущен";
system("C:\\cpp\\Project1\\Debug\\Project1.exe");
}
}
else if (args == "нет") {
ci.dwFillAttribute = text_color() | background_color();
DWORD dw = prioritet();
OPENFILENAME ofn = { sizeof ofn };
ofn.lpstrFile = filename();
ci.lpTitle = (LPWSTR)L"Заголовок второй консоли";
if (CreateProcess(ofn.lpstrFile, NULL,
NULL, NULL, FALSE, CREATE_NEW_CONSOLE | dw, NULL, NULL, &ci, &pi))
{
cout << "\nИдентификатор процесса: " << pi.dwProcessId;
cout << "\nДескриптор процесса:" << pi.hProcess;
cout << "\nПроцесс запущен";
}
}
WaitForSingleObject(pi.hProcess, INFINITE);
CloseHandle(pi.hProcess);
CloseHandle(pi.hThread);
}

Код файлу Functions.cpp


#include <iostream>
#include <string>
#include <process.h>
#include <cstdlib>
#include <Windows.h>

using namespace std;

//Выбор файла
LPWSTR filename() {
OPENFILENAME n = { sizeof n };
wchar_t file[1024];
file[0] = '\0';
n.lpstrFile = file;
n.nMaxFile = 1024;
n.Flags = OFN_ALLOWMULTISELECT | OFN_EXPLORER;
GetOpenFileName(&n);
return n.lpstrFile;
}

//Выбор цвета текста


DWORD text_color() {
STARTUPINFO k;
ZeroMemory(&k, sizeof(k));
int col = 0;
cout << "Выберите цвет текста: \n0-Без изменений\n1-Красный\n2-Синий \n3-Зеленый\
n4-Желтый\n5-Cерый\n6-Маджента\n";
cin >> col;
switch (col) {
case 0:
break;
case 1:
return k.dwFillAttribute = FOREGROUND_RED;
break;
case 2:
return k.dwFillAttribute = FOREGROUND_BLUE;
break;
case 3:
return k.dwFillAttribute = FOREGROUND_GREEN;
break;
case 4:
return k.dwFillAttribute = FOREGROUND_INTENSITY | FOREGROUND_RED |
FOREGROUND_GREEN;
break;
case 5:
return k.dwFillAttribute = FOREGROUND_INTENSITY;
break;
case 6:
return k.dwFillAttribute = FOREGROUND_INTENSITY | FOREGROUND_RED |
FOREGROUND_BLUE;
break;
}
}

//Выбор цвета фона


DWORD background_color() {
STARTUPINFO k;
ZeroMemory(&k, sizeof(k));
int col = 0;
cout << "Выберите цвет фона(Выберите цвет фона, который отличается от цвета
текста): \n0-Без изменений\n1-Красный\n2-Синий \n3-Зеленый\n4-Желтый\n5-Cерый\n6-
Маджента\n";
cin >> col;
switch (col) {
case 0:
break;
case 1:
return k.dwFillAttribute = BACKGROUND_RED;
break;
case 2:
return k.dwFillAttribute = BACKGROUND_BLUE;
break;
case 3:
return k.dwFillAttribute = BACKGROUND_GREEN;
break;
case 4:
return k.dwFillAttribute = BACKGROUND_INTENSITY | BACKGROUND_RED |
BACKGROUND_GREEN;
break;
case 5:
return k.dwFillAttribute = BACKGROUND_INTENSITY;
break;
case 6:
return k.dwFillAttribute = BACKGROUND_INTENSITY | BACKGROUND_RED |
BACKGROUND_BLUE;
break;
}
}

//Выбор приоритета
DWORD prioritet() {
string prioritet;
DWORD d;
cout << "\nВведите приоритет(0x00000010):\n";
cin >> prioritet;
return d = strtoul(prioritet.c_str(), NULL, 16);
}

Код файлу Laba2.h


#pragma once
#include <windows.h>

LPWSTR filename(); //Выбор каталога для запуска программы

DWORD text_color(); //Выбор цвета текста

DWORD background_color(); //Выбор цвета фона

DWORD prioritet(); //Выбор приоритета


4. Запуск програми
Для демонстрації роботи даної програми, вона постійно буде відкривати
файл з розширенням .exe, який виводить на екран строку “HELLO WORLD!”.

Рис. 4. Запуск процесу


 Якщо в даному вікні клацнути на кнопку «да», тоді просто знов
запуститься обрана програма.
 Якщо в даному вікні клацнути на кнопку «нет», тоді користувач
матиме можливість змінити пріоритет, колір тексту та фону нової
консолі та обрати програму за допомогою стандартного вікна вибору
імені файлу.
Рис. 5. Вибір кольору та пріоритету

Рис. 6. Вибір файлу для запуску

Після вибору цих критеріїв отримуємо остаточний результат:


Рис. 7. Результат в першій консолі

Рис. 8. Результат в другій консолі

Висновок: У ході лабораторної роботи №2 я навчився запускати виконані


файли з власних програм і створив для цього власну програму. Вивчив нові
функції, які можна застосовувати для цього. Вивчив основні WinApi функції,
що застосовуються для роботи з процесами. Ознайомився з такими
функціями, як: system, spawn, exec , messagebox , createprocess.

You might also like