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.
На этом программирование закончилось.
Для начала работы с программой необходимо записать файл с расписанием следующего формата "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 [] ="запуск по расписанию\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)
{