Смекни!
smekni.com

Системное программирование в операционных системах (стр. 3 из 4)

IDABORT - выбрана кнопка Abort.

IDCANCEL - выбрана кнопка Cancel.

IDIGNORE - выбрана кнопка Ignore.

IDNO - выбрана кнопка No.

IDOK - выбрана кнопка OK.

IDRETRY - выбрана кнопка Retry.

IDYES - выбрана кнопка Yes.

Если окно содержит кнопку Cancel, то функция возвращает значение IDCANCEL в случае нажатия клавиши ESC или выбора кнопки Cancel. Если кнопка Cancel отсутствует, то нажатие клавиши ESC не имеет эффекта.

На этом создание программы на языке Си закончилось.

Создание процесса.

"Процесс - это выполняющееся приложение, которое состоит из личного виртуального адресного пространства, кода, данных и других ресурсов операционной системы, таких как файлы, пайпы и синхронизационные объекты, видимые для процесса."

У процесса есть несколько объектов: адресное пространство, выполняемый модуль (модули) и все, что эти модули создают или открывают. Как минимум, процесс должен состоять из выполняющегося модуля, личного адресного пространства и ветви. У каждого процесса по крайней мере одна ветвь. Что такое ветвь? Фактически, ветвь - это выполняющаяся очередь. Когда Windows впервые создает процесс, она делает только одну ветвь на процесс. Эта ветвь обычно начинает выполнение с первой инструкции в модуле. Если в дальнейшем понадобится больше ветвей, он может сам создать их.

Когда Windows получает команду для создания процесса, она создает личное адресное пространство для процесса, а затем она загружает исполняемый файл в пространство. После этого она создает основную ветвь для процесса.

Под Win32 можно создать процессы из своих программ с помощью функции Createprocess. Она имеет следующих синтаксис:

BOOL CreateProcess (

LPCTSTR lpszApplicationName.

LPCTSTR IpszCommandLine,

LPSECURITYJUTRIBUTES ipsaProcess.

LPSECURITY_ATTRIBUTES lpsaThread,

BOOL flnhentHandles,

DWORD fdwCreate,

LPVOID ipvEnvironment.

LPTSTR lpszCurDir,

LPSTARTUPINFO ipsiStartlnfo,

LPPROCESS_INFORMATION lppiProcInfo):

Когда поток в приложении вызывает CreateProcess, система создает объект ядра "процесс" с начальным значением счетчика числа его пользователей, равным 1. Этот объект - не сам процесс, а компактная структура данных, через которую операционная система управляет процессом. (Объект ядра "процесс" следует рассматривать как структуру данных со статистической информацией о процессе) Затем система создает для нового процесса виртуальное адресное пространство размером 4 Гб и загружает в него код и данные как для исполняемого файла, так и для любых DLL (если таковые требуются).

Далее система формирует объект ядра "поток" (со счетчиком, равным 1) для первичного потока нового процесса. Как и в первом случае, объект ядра "поток" - это компактная структура данных, через которую система управляет потоком. Первичный поток начнет с исполнения стартового кода из стандартной библиотеки С, который - как всегда - вызовет функцию WinMain. Если системе удастся создать новый процесс и его первичный поток, CreateProcess вернет TRUE.

На этом программирование закончилось.

4. Руководство пользователя

Для начала работы с программой необходимо записать файл с расписанием следующего формата "C: /totalcmd/TOTALCMD. EXE" 00: 00: 00

Далее необходимо запустить файл с названием OSkurs. После запуска появится окно которое представлено на рис.10.

Рисунок 2.

Далее необходимо ввести в окошко полное имя файла в котором находится расписание и нажать на клавишу “Установить расписание”. После чего будет происходить запуск программ по расписанию. Если имя не будет указано, то появится окошко:

Рисунок 3.

Если данного файла не существует или имя указано не верно то выдаётся сообщение.

Рисунок 4

Если файл с расписанием записан не верно, то выдаётся сообщение:

Рисунок 5

Если имя программы указано с ошибкой или его не существует, то выдаётся сообщение и два варианта продолжения работы программы:

Рисунок 6.

После успешного окончания работы программы выдаётся сообщение:

Рисунок 7.

Для завершения расписания необходимо нажать на клавишу “Остановить работу". Для выхода из программы необходимо нажать на клавишу “Выход” или нажав на “крестик".

Заключение

В процессе выполнения курсового проекта была разработана программа, выполняющая запуск программ по расписанию, расписание хранится в файле. Программа была написана при помощи интегрированной среды разработки VisualC++. Программа соответствует всем функциональным требованиям, заданным на курсовое проектирование. Взаимодействие с пользователем осуществляется с помощью графического интерфейса.

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

Список использованных источников

1. Келецкий Я. Энциклопедия языка Си/ Пер. с англ. - М.: Мир, 1992. - 687с.

2. Керниган Б., Ричи Д., Фьюер А. Язык программирования Си. Задачи по языку С / Пер. с англ. - М.: Финансы и статистика, 1985. - 279с.

Алгоритм программы

Приложение А

---------------------- [на лист 2

Рисунок А.1. Алгоритм программы


------------------------ [с листа1

Рисунок А.1. Лист №2

Приложение Б

Текст программы

#include <windows. h>

#include "resource. h"

#include <io. h>

#define WM_SHELLNOTIFY WM_USER+5

#define IDC_RESTORE 1000

#define TM 1001

typedef struct _SHEDULEDATA {

char fname [120] ;

char tname [6] ;

int h;

int m;

int s;

int priority;

int delay;

} SHEDULEDATA;

char * FileOpen (HWND hWnd);

int FindNext (SHEDULEDATA sd [30], int count);

void cstrcpy (char *a,char *b, int from, int count);

void MakeItStandart (SHEDULEDATA sd [30], int count);

void SubtDelay (SHEDULEDATA sd [30], int count, int delay);

int ReadShedule (HANDLE hFile,SHEDULEDATA sd [30]);

LRESULT CALLBACK WindowProc (HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam); // дескриптор окна

INT CALLBACK MyDlgProc (HWND hDlg, // обращается к dialog box

UINTuMsg, // сообщение

WPARAMwParam, // первый параметр сообщения

LPARAMlParam // второй параметр сообщения);

int APIENTRY WinMain (HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPSTR lpCmdLine,

int nCmdShow)

{

WNDCLASS wcl;

HWND hWnd;

MSG lpMsg;

// заполнение структуры с параметрами окна программы

wcl. style=CS_HREDRAW|CS_VREDRAW; // стиль окна

wcl. lpfnWndProc=WindowProc; // ф-ция обработки событий окна // оконная процедура

wcl. cbClsExtra=0; // дополнительные байты класса

wcl. cbWndExtra=0; // дополнительные байты окна

wcl. hInstance=hInstance; // дескриптор экземпляра окна // дескриптор пиктограммы

wcl. hIcon=LoadIcon (NULL, IDI_APPLICATION);

wcl. hCursor=LoadCursor (NULL, IDC_ARROW); // дескриптор курсора

wcl. hbrBackground= (HBRUSH) GetStockObject (WHITE_BRUSH);); // цвет фона

wcl. lpszMenuName=NULL; // имя ресурса с главным меню программы // ресурс меню, связанный с окном

wcl. lpszClassName="Pass"; // имя класса окна

if (! RegisterClass (&wcl))

return 0;

hWnd=CreateWindow (wcl. lpszClassName,"window",WS_OVERLAPPEDWINDOW,CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, CW_USEDEFAULT, NULL, NULL, hInstance, NULL);

ShowWindow (hWnd,SW_HIDE);

UpdateWindow (hWnd);

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

{

TranslateMessage (&lpMsg);

DispatchMessage (&lpMsg);

}

return lpMsg. wParam;

}

LRESULT CALLBACK WindowProc (HWND hWnd,UINT message,WPARAM wParam,LPARAM lParam) // дескриптор окна

{

static HINSTANCE hInstance;

switch (message)

{

case WM_CREATE:

{

hInstance = ( (LPCREATESTRUCT) lParam) - >hInstance;

DialogBox (hInstance, IDD_DIAL,hWnd, MyDlgProc);

break;

}

case WM_DESTROY:

{

PostQuitMessage (0);

break;

}

default:

return DefWindowProc (hWnd, message, wParam, lParam);

}

return 0;

}

INT CALLBACK MyDlgProc (HWND hDlg,UINT uMsg,WPARAM wParam,LPARAM lParam)

{

static SHEDULEDATA sd [30] ;

static int count,nextexe,delayexe;

static char name [300] ;

char * n;

static BOOL frst, fileopen = FALSE,filewasopened=FALSE;

BOOL cp;

char tip [] ="запуск по расписанию&bsol;0";

UINT uId=111;

static NOTIFYICONDATA nfd;

int i;

static STARTUPINFO si;

static HANDLE hMenu,hTimer,hFile;

static PROCESS_INFORMATION pi;

switch (uMsg)

{

case WM_INITDIALOG:

{

si. cb=sizeof (STARTUPINFO);

GetStartupInfo (&si);

nfd. cbSize=sizeof (NOTIFYICONDATA);

nfd. hWnd=hDlg;

nfd. uID=uId;

nfd. uFlags=NIF_MESSAGE|NIF_TIP|NIF_ICON;

nfd. uCallbackMessage=WM_SHELLNOTIFY;

lstrcpy (nfd. szTip,tip);

nfd. hIcon=LoadIcon (NULL, IDI_WINLOGO);

hMenu = CreatePopupMenu ();

AppendMenu (hMenu,MF_ENABLED|MF_STRING, IDC_RESTORE,"восстановить");

AppendMenu (hMenu,MF_ENABLED|MF_SEPARATOR,0,0);

AppendMenu (hMenu,MF_ENABLED|MF_STRING, IDC_EXIT,"закрыть");

frst=TRUE;

SetDlgItemText (hDlg, IDC_TEXT,"");

return (TRUE);

}

case WM_CLOSE:

{

if (filewasopened)

CloseHandle (hFile);

Shell_NotifyIcon (NIM_DELETE,&nfd);

DestroyMenu (hMenu);

SendMessage (GetParent (hDlg),WM_DESTROY,0,0);

EndDialog (hDlg, 0);

return (TRUE);

}

case WM_SIZE:

{

if (wParam==SIZE_MINIMIZED)

{

ShowWindow (hDlg,SW_HIDE);

Shell_NotifyIcon (NIM_ADD,&nfd);

}

return TRUE;

}

case WM_TIMER:

{

cp=CreateProcess (sd [nextexe]. fname,NULL,NULL,FALSE,CREATE_DEFAULT_ERROR_MODE,NULL,NULL,NULL,&si,&pi);

KillTimer (hDlg,TM);

if (! cp)

{

if (MessageBox (hDlg,"Приложение не удалось запустить. Продолжить работу?",sd [nextexe]. fname,MB_YESNO|MB_ICONERROR) ==IDNO)

SendMessage (hDlg,WM_COMMAND, IDC_STOP,0);

else

SendMessage (hDlg,WM_COMMAND, IDC_START,0);

}

else

{

nextexe=FindNext (sd,count);

if (nextexe<0)

{

SendMessage (hDlg,WM_COMMAND, IDC_STOP,0);

return TRUE;

}

delayexe=sd [nextexe]. delay;

sd [nextexe]. delay=-1;

SubtDelay (sd,count,delayexe);

if (! SetTimer (hDlg,TM,1000*delayexe,NULL))

{

frst=TRUE;

if (MessageBox (hDlg,"В системе нет свободных таймеров. ",0,MB_RETRYCANCEL| MB_ICONERROR) ==IDRETRY)

SendMessage (hDlg,WM_COMMAND, IDC_START,0);

else

SendMessage (hDlg,WM_COMMAND, IDC_STOP,0);

}

}

return TRUE;

}

case WM_SHELLNOTIFY:

{

POINT pn;

if (wParam==uId)

{

if (lParam==WM_RBUTTONDOWN)

{

GetCursorPos (&pn);

SetForegroundWindow (hDlg);

TrackPopupMenu (hMenu,TPM_RIGHTALIGN,pn. x,pn. y,0,hDlg,NULL);

PostMessage (hDlg,WM_NULL,0,0);

}

else if (lParam==WM_LBUTTONDOWN)

SendMessage (hDlg,WM_COMMAND, IDC_RESTORE,0);

}

return TRUE;

}

case WM_COMMAND:

switch (LOWORD (wParam))

{

case IDC_EXIT:

{

if (filewasopened)

CloseHandle (hFile);

Shell_NotifyIcon (NIM_DELETE,&nfd);

DestroyMenu (hMenu);

SendMessage (GetParent (hDlg),WM_DESTROY,0,0);

EndDialog (hDlg,0);

return TRUE;

}

case IDC_OPEN:

{

n=FileOpen (hDlg);

if (n! =0)

{

lstrcpy (name,n);

fileopen=TRUE;

SetDlgItemText (hDlg, IDC_TEXT,name);

}

return TRUE;

}

case IDC_START:

{

if (frst)

{

if (! fileopen)

{