Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 28 января!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Возможности языков семейства Си по истине безграничны, однако, в этой свободе кроются и недостатки: всегда нужно программисту держать ухо востро и контроллировать "переполнение буфера", чтобы потом программа не вылетала в "синий экран" на массе разнообразных версий Windows и железа у пользователей. Те же крэкеры и реверсеры специально ищут в коде программ на Си уязвимости, куда можно подсадить любой вирусный код, об этом более подробно автор рассказывал в своём видеокурсе здесь. Я там многое узнал и теперь мой код стал значительно более безопасный.
Использование класса CEvent

Взаимоисключения

Данный объект поъож на критическую секцию, но может работать на уровнепотоков различных прочессов(приложений). Методы Locl и Unlock этогокласса работают так же, как и для критической секции. Единственное отличие заключается в том, что фукнция Lock не может иметь параметра.

Представлю конструктор класса:

CMutex
 
 (
 
    BOOL bInitiallyOwn = false,
 
    LPCTSTE lpszName = NULL,
 
    LPSECURITY_ATTRINUTES lpsaAttribute = NULL
 
 )

Первый параметр задаёт начальное состояние объекта, если true, то состояние - "сброшен". Последний параметр носит аналогичную природу, что и для потока. А вот второй параметр позволяет создавать именованный объект "взаимоисключение". При попытке создания ещё одного объекта с тем же именем будет генерироваться исключение типа CresourceWxception.

CEvent

Здесь ма рассмотрим пример программы использующая класс CEvent. Посредством нажатия кнопки запускается два потока. Оба потока пользуются общим ресурсом - переменной theApp.m_che. Для разделения доступа используются два объекта синхронизации, создаваемые посредством класса CEvent. Еще один объект синхронизации используется в вспомогательных целях для синхронизации окончания работы обоих потоков. Первый поток помещает в общий ресурс символ, а второй берет этот символ и печатает его в диалоговом окне. Как мы уже сказали, оба эти действия синхронизированы.

Модуль event.h

#pragma once
 
 
 
 #ifndef __AFXWIN_H__
 
 	#error include 'stdafx.h' before including this file for PCH
 
 #endif
 
 
 
 #include "resource.h"
 
 
 
 
 
 class CeventApp : public CWinApp
 
 {
 
 public:
 
 	CeventApp();
 
 
 
 	public:
 
 		char m_ch;
 
 	virtual BOOL InitInstance();
 
 
 
 
 
 	DECLARE_MESSAGE_MAP()
 
 };
 
 
 
 extern CeventApp theApp;

модуль event.cpp

#include "stdafx.h"
 
 #include "event.h"
 
 #include "eventDlg.h"
 
 
 
 #ifdef _DEBUG
 
 #define new DEBUG_NEW
 
 #endif
 
 
 
 CeventDlg * dlg;
 
 
 
 BEGIN_MESSAGE_MAP(CeventApp, CWinApp)
 
 	ON_COMMAND(ID_HELP, CWinApp::OnHelp)
 
 END_MESSAGE_MAP()
 
 
 
 
 
 
 
 CeventApp::CeventApp()
 
 :m_ch(0)
 
 {
 
 
 
 }
 
 
 
 
 
 CeventApp theApp;
 
 
 
 
 
 BOOL CeventApp::InitInstance()
 
 {
 
 	InitCommonControls();
 
 
 
 	CWinApp::InitInstance();
 
 
 
 	dlg = new CeventDlg;
 
 	m_pMainWnd = dlg;
 
 	INT_PTR nResponse = dlg->DoModal();
 
 	if (nResponse == IDOK)
 
 	{
 
 
 
 	}
 
 	else if (nResponse == IDCANCEL)
 
 	{
 
 
 
 	}
 
 
 
 	return FALSE;
 
 }

модульeventDlh.h

#pragma once
 
 #include "afxmt.h"
 
 
 
 class CeventDlg : public CDialog
 
 {
 
 public:
 
 	CeventDlg(CWnd* pParent = NULL);
 
 	enum { IDD = IDD_EVENT_DIALOG };
 
 
 
 	protected:
 
 	virtual void DoDataExchange(CDataExchange* pDX);
 
 
 
 
 
 protected:
 
 	HICON m_hIcon;
 
 
 
 	virtual BOOL OnInitDialog();
 
 	afx_msg void OnPaint();
 
 	afx_msg HCURSOR OnQueryDragIcon();
 
 	DECLARE_MESSAGE_MAP()
 
 public:
 
 	CEvent ev1;
 
 	CEvent ev2;
 
 	CEvent ev3;
 
 	afx_msg void OnBnClickedButton1();
 
 	afx_msg void OnBnClickedOk();
 
 	afx_msg void OnBnClickedCancel();
 
 };

модуль eventDlg.cpp

#include "stdafx.h"
 
 #include "event.h"
 
 #include "eventDlg.h"
 
 
 
 #ifdef _DEBUG
 
 #define new DEBUG_NEW
 
 #endif
 
 
 
 UINT thr1(LPVOID);
 
 UINT thr2(LPVOID);
 
 extern CeventDlg * dlg;
 
 
 
 
 
 CeventDlg::CeventDlg(CWnd* pParent /*=NULL*/)
 
 	: CDialog(CeventDlg::IDD, pParent), ev1(), ev2(), ev3()
 
 {
 
 	m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
 
 }
 
 
 
 void CeventDlg::DoDataExchange(CDataExchange* pDX)
 
 {
 
 	CDialog::DoDataExchange(pDX);
 
 }
 
 
 
 BEGIN_MESSAGE_MAP(CeventDlg, CDialog)
 
 	ON_WM_PAINT()
 
 	ON_WM_QUERYDRAGICON()
 
 	ON_BN_CLICKED(IDC_BUTTON1, OnBnClickedButton1)
 
 	ON_BN_CLICKED(IDOK, OnBnClickedOk)
 
 	ON_BN_CLICKED(IDCANCEL, OnBnClickedCancel)
 
 END_MESSAGE_MAP()
 
 
 
 
 
 BOOL CeventDlg::OnInitDialog()
 
 {
 
 	CDialog::OnInitDialog();
 
 
 
 	SetIcon(m_hIcon, TRUE);
 
 	SetIcon(m_hIcon, FALSE);
 
 
 
 	return TRUE;
 
 }
 
 
 
 void CeventDlg::OnPaint()
 
 {
 
 	CDialog::OnPaint();
 
 }
 
 
 
 HCURSOR CeventDlg::OnQueryDragIcon()
 
 {
 
 	return static_cast<HCURSOR>(m_hIcon);
 
 }
 
 
 
 void CeventDlg::OnBnClickedButton1()
 
 {
 
 	dlg->ev1.ResetEvent();
 
 	dlg->ev2.ResetEvent();
 
 	dlg->ev3.ResetEvent();
 
 	AfxBeginThread(thr1, 0, THREAD_PRIORITY_NORMAL);
 
 	AfxBeginThread(thr2, 0, THREAD_PRIORITY_NORMAL);
 
 }
 
 
 
 void CeventDlg::OnBnClickedOk()
 
 {
 
 	OnOK();
 
 }
 
 
 
 void CeventDlg::OnBnClickedCancel()
 
 {
 
 	OnCancel();
 
 }
 
 
 
 UINT thr1(LPVOID param)
 
 {
 
 	char * ch="Вывод строки";
 
 	int i;
 
 	for(i=0; i<strlen(ch); i++)
 
 	{
 
 		theApp.m_ch=ch[i];
 
 		dlg->ev2.SetEvent();
 
 		::WaitForSingleObject(dlg->ev1.m_hObject,INFINITE);
 
 		dlg->ev1.ResetEvent();
 
 	}
 
 	dlg->ev3.SetEvent();
 
 	return 0;
 
 }
 
 
 
 UINT thr2(LPVOID param)
 
 {
 
 	char s[2];
 
 	s[1]=0;
 
 	int i=10;
 
 	CDC *dc = dlg->GetDC();
 
 lo:
 
 	::WaitForSingleObject(dlg->ev2.m_hObject,INFINITE);
 
 	dlg->ev2.ResetEvent();
 
 	s[0]=theApp.m_ch;
 
 	dc->TextOut(i,10,s);
 
 	dlg->ev1.SetEvent();
 
 	i=i+15;
 
 	if(::WaitForSingleObject(dlg->ev3.m_hObject,0)==WAIT_OBJECT_0)
 
 	{
 
 		dc->DeleteDC();
 
 		return 0;
 
 	}
 
 	goto lo;
 
 	return 0;
 
 }


<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS