Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Zvitische.docx
Скачиваний:
0
Добавлен:
01.07.2025
Размер:
353 Кб
Скачать
☆

Лабораторна робота № 4. Дослідження особливостей використання арі-функцій для роботи із процесами та потоками у Windows

Програма:

#define WIN32_LEAN_AND_MEAN

using namespace std;

#include "stdafx.h"

#include "windows.h"

#include "resource.h"

#include <string>

const unsigned short int max=10;

STARTUPINFO St_Info;

unsigned short int i, ProcNum=0;

PROCESS_INFORMATION Proc_Info[max];

std::string help_str1, help_str2;

char* buf;

HMENU Sub_Menu;

HINSTANCE hInst;

LRESULT CALLBACK WndProc(HWND, UINT, WPARAM,LPARAM);

int APIENTRY WinMain(

HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPSTR lpCmdLine,

int nCmdShow)

{

HWND hwnd;

MSG msg;

WNDCLASS w;

memset(&w,0,sizeof(WNDCLASS));

w.style = CS_HREDRAW | CS_VREDRAW;

w.lpfnWndProc = WndProc;

w.hInstance = hInstance;

w.hbrBackground = (HBRUSH)COLOR_WINDOW;

w.lpszClassName = "C Windows";

w.lpszMenuName=MAKEINTRESOURCE(IDR_MENU1);

RegisterClass(&w);

hwnd = CreateWindow("C Windows","C Windows", WS_OVERLAPPEDWINDOW,

10,10,600,480,NULL,NULL,hInstance,NULL);

ShowWindow(hwnd,nCmdShow);

//HMENU hMenu=LoadMenu(hInstance, MAKEINTRESOURCE(IDR_MENU1));

//SetMenu(hwnd, hMenu);

UpdateWindow(hwnd);

hInst= hInstance;

while(GetMessage(&msg,NULL,0,0))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

return msg.wParam;

}

LRESULT CALLBACK WndProc(HWND hwnd, UINT Message, WPARAM wparam,LPARAM lparam)

{

if (Message == WM_DESTROY)

{

PostQuitMessage(0);

return 0;

}

if (Message == WM_RBUTTONUP)

{

MessageBox(hwnd, "WM_RBUTTONUP", "Message", MB_ICONINFORMATION | MB_OK);

}

// створення в³кна

if (Message == WM_CREATE)

{

Sub_Menu=GetSubMenu(GetMenu(hwnd),0);

}

if (Message == WM_PAINT)

{

}

//обробка под³й меню

if (Message == WM_COMMAND)

{

switch ( LOWORD(wparam) )

{

case IDM_New_Process:

{

if (ProcNum<max)

{

St_Info.cb=sizeof(St_Info);

St_Info.lpReserved=NULL;

St_Info.lpDesktop=NULL;

St_Info.lpTitle=NULL;

St_Info.dwFlags=STARTF_USESHOWWINDOW;

St_Info.wShowWindow=SW_SHOWNORMAL;

St_Info.cbReserved2=0;

St_Info.lpReserved2=NULL;

if (CreateProcess(NULL,"Notepad.exe",

NULL,NULL,false,0,NULL,NULL,&St_Info,&Proc_Info[ProcNum]))

{

ProcNum++;

help_str1="";

buf=(char*)malloc(sizeof(DWORD));

itoa((DWORD)Proc_Info[ProcNum-1].hProcess, buf, 10);

help_str2=buf;

help_str1=help_str1+"Дескриптор процесу: " + help_str2.data();

itoa((DWORD)Proc_Info[ProcNum-1].hThread, buf, 10);

help_str2=buf;

help_str1=help_str1 + ", Дескриптор потоку: " + help_str2.data();

itoa((DWORD)Proc_Info[ProcNum-1].dwProcessId, buf, 10);

help_str2=buf;

help_str1=help_str1 + ", ²дентиф³катор процесу: " + help_str2.data();

itoa((DWORD)Proc_Info[ProcNum-1].dwThreadId, buf, 10);

help_str2=buf;

help_str1=help_str1 + ", ²дентиф³катор потоку: " + help_str2.data();

MessageBox(hwnd, help_str1.data(),"Новий процес створено!", MB_OK);

EnableMenuItem(Sub_Menu,IDM_Kill_Process,MF_BYCOMMAND + MF_ENABLED);

}

else

MessageBox(hwnd,"Неможливо створити процес","Створення процесу", MB_OK);

}else MessageBox(hwnd,"Дуже багато створено процес³в",

"Створення процесу", MB_OK);

break;

}

case IDM_Kill_Process:

{

if (ProcNum>0)

{

DWORD ExitCode;

GetExitCodeProcess(Proc_Info[ProcNum-1].hProcess, &ExitCode);

if (ExitCode==STILL_ACTIVE)

TerminateProcess(Proc_Info[ProcNum-1].hProcess,0);

else MessageBox(hwnd,"Неможливо завершити процес",

"Завершення процесу", MB_OK);

ProcNum--;

}

if (ProcNum==0)

{

EnableMenuItem(Sub_Menu,IDM_Kill_Process,

MF_BYCOMMAND + MF_GRAYED); //якщо немаº запущ. процес³в - зробити недоступним пункт меню.

MessageBox(hwnd,"Немаº б³льше процес³в",

"Завершення процесу", MB_OK);

}

break;

}

case IDM_Exit:

{

SendMessage(hwnd,WM_CLOSE,0,0);

break;

}

case ID_INFO:

{

MessageBox(hwnd, "Лабораторна робота з ОС", "Info", MB_ICONINFORMATION);

break;

}

}

}

return DefWindowProc(hwnd,Message,wparam,lparam);

}

#include <iostream>

#include <windows.h>

using namespace std;

DWORD ThreadId;

DWORD ThreadParameter=10;

HANDLE hThread;

DWORD WINAPI MyThread(LPVOID lpParam)

{

TCHAR msgBuf[100]="Hello from thread!";

MessageBox(NULL, msgBuf, "mess..", MB_ICONINFORMATION);

return 0;

}

int main()

{

cout<<"Creating thread...\n";

hThread=CreateThread(

NULL, // атрибути безпеки за замовчуванням

0, // розмір стека за замовчуванням

(LPTHREAD_START_ROUTINE)MyThread , // вказівник на процедуру створюваного потоку

&ThreadParameter, // аргумент, що передається функції потоку

0, // прапорці створення за замовчуванням

&ThreadId); // отриманий ідентифікатор потоку

if (!hThread)

cout<<"CreateThread failed.";

WaitForSingleObject(hThread, 2000);

CloseHandle(hThread);

return 0;

}