Работа с дисками с использованием функций API. Определение размера памяти

Требования к программированию функций Windows API для обработки дисковых файлов, их записи и чтения. Определение размеров оперативной и физической памяти компьютера. Механизмы организации связи программ на С#, использование функций и переменных.

Рубрика Программирование, компьютеры и кибернетика
Вид методичка
Язык русский
Дата добавления 05.07.2014
Размер файла 505,6 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://allbest.ru

Министерство образования и науки РФ

ФГБОУ ВПО

Волгоградский государственный технический университет

Факультет подготовки инженерных кадров

Кафедра: САПР и ПК

Курсовая работа

по дисциплине: «Системное программное обеспечение»

Выполнил:

студент группы АУЗ - 361с

Тюляева И.А.

Проверил: доц. Бутенко Д.В.

Волгоград 2013

Лабораторная работа № 1

«Работа с дисками с использованием функций API».

Цель работы

Изучить основные требования к программированию функций Windows API для обработки дисковых файлов для записи и чтения дисковых файлов.

Задание

Разработать программу, использующую стандартные функции API, для индикации следующих показателей файловой системы:

Определение количества секторов в классе;

Определения количества байт в секторе;

Определение свободных кластеров на диске;

Определение общего количества кластеров;

Определение общего объема диска;

Определение свободного объема на диске.

Описание используемых API функций

1. Функция возвращает информацию о числе свободных кластеров и секторов и размерах сектора и кластера для данного диска.

BOOL WINAPI GetDiskFreeSpace(

_In_ LPCTSTR lpRootPathName,

_Out_ LPDWORDlpSectorsPerCluster,

_Out_ LPDWORDlpBytesPerSector,

_Out_ LPDWORDlpNumberOfFreeClusters,

_Out_ LPDWORDlpTotalNumberOfClusters );

Описание параметров представлено в следующей таблице:

Параметр

Описание

lpRootPathName

Название диска

lpSectorsPerCluster

Количество секторов в классе

lpBytesPerSector

Количество байт в секторе

lpNumberOfFreeClusters

Свободные кластеры на диске

lpTotalNumberOfClusters

Общее количество кластеров

2. Функция GetDiskFreeSpaceEx получает информацию о диске, который содержит текущий путь.

BOOL WINAPI GetDiskFreeSpaceEx(

_In_opt_ LPCTSTR lpDirectoryName,

_Out_opt_ PULARGE_INTEGER lpFreeBytesAvailable,

_Out_opt_ PULARGE_INTEGER lpTotalNumberOfBytes,

_Out_opt_ PULARGE_INTEGER lpTotalNumberOfFreeBytes

);

Описание параметров представлено в следующей таблице:

Параметр

Описание

lpDirectoryName

Название пути

lpFreeBytesAvailable

Количество свободных байтов на диске

lpTotalNumberOfBytes

Общий объем диска

lpTotalNumberOfFreeBytes

Свободный объем на диске

Окно программы

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

// Lab1.cpp: определяет точку входа для приложения.

//

#include "stdafx.h"

#include "Lab1.h"

#include <sstream>

#define MAX_LOADSTRING 100

typedef BOOL (WINAPI *P_GDFSE)(LPCTSTR, PULARGE_INTEGER, PULARGE_INTEGER, PULARGE_INTEGER);

// Глобальные переменные:

HINSTANCE hInst;// текущий экземпляр

TCHAR szTitle[MAX_LOADSTRING];// Текст строки заголовка

TCHAR szWindowClass[MAX_LOADSTRING];// имя класса главного окна

// Отправить объявления функций, включенных в этот модуль кода:

ATOM MyRegisterClass(HINSTANCE hInstance);

BOOL InitInstance(HINSTANCE, int);

LRESULT CALLBACKWndProc(HWND, UINT, WPARAM, LPARAM);

INT_PTR CALLBACKAbout(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPTSTR lpCmdLine,

int nCmdShow)

{

UNREFERENCED_PARAMETER(hPrevInstance);

UNREFERENCED_PARAMETER(lpCmdLine);

// TODO: разместите код здесь.

MSG msg;

HACCEL hAccelTable;

// Инициализация глобальных строк

LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);

LoadString(hInstance, IDC_LAB1, szWindowClass, MAX_LOADSTRING);

MyRegisterClass(hInstance);

// Выполнить инициализацию приложения:

if (!InitInstance (hInstance, nCmdShow))

{

return FALSE;

}

hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_LAB1));

// Цикл основного сообщения:

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

{

if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}

return (int) msg.wParam;

}

// ФУНКЦИЯ: MyRegisterClass()

//

// НАЗНАЧЕНИЕ: регистрирует класс окна.

//

// КОММЕНТАРИИ:

//

// Эта функция и ее использование необходимы только в случае, если нужно, чтобы данный код

// был совместим с системами Win32, не имеющими функции RegisterClassEx'

// которая была добавлена в Windows 95. Вызов этой функции важен для того,

// чтобы приложение получило "качественные" мелкие значки и установило связь

// с ними.

//

ATOM MyRegisterClass(HINSTANCE hInstance)

{

WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style= CS_HREDRAW | CS_VREDRAW;

wcex.lpfnWndProc= WndProc;

wcex.cbClsExtra= 0;

wcex.cbWndExtra= 0;

wcex.hInstance= hInstance;

wcex.hIcon= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_LAB1));

wcex.hCursor= LoadCursor(NULL, IDC_ARROW);

wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);

wcex.lpszMenuName= MAKEINTRESOURCE(IDC_LAB1);

wcex.lpszClassName= szWindowClass;

wcex.hIconSm= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

return RegisterClassEx(&wcex);

}

//

// ФУНКЦИЯ: InitInstance(HINSTANCE, int)

//

// НАЗНАЧЕНИЕ: сохраняет обработку экземпляра и создает главное окно.

//

// КОММЕНТАРИИ:

//

// В данной функции дескриптор экземпляра сохраняется в глобальной переменной, а также

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

//

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)

{

HWND hWnd;

hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной

hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

if (!hWnd)

{

return FALSE;

}

ShowWindow(hWnd, nCmdShow);

UpdateWindow(hWnd);

return TRUE;

}

// ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)

//

// НАЗНАЧЕНИЕ: обрабатывает сообщения в главном окне.

//

// WM_COMMAND- обработка меню приложения

// WM_PAINT-Закрасить главное окно

// WM_DESTROY - ввести сообщение о выходе и вернуться.

//

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

int wmId, wmEvent;

PAINTSTRUCT ps;

HDC hdc;

switch (message)

{

case WM_CREATE:

// название диска

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT(" Название диска"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

20, 10, 300, 25, hWnd, (HMENU)IDC_LABEL1, GetModuleHandle(NULL), NULL);

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), TEXT("C:\\"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

320, 10, 300, 25, hWnd, (HMENU)IDC_LPROOTPATHNAME, GetModuleHandle(NULL), NULL);

// Определение количества секторов в классе

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT(" Количество секторов в классе"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

20, 50, 300, 25, hWnd, (HMENU)IDC_LABEL2, GetModuleHandle(NULL), NULL);

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT("0"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

320, 50, 300, 25, hWnd, (HMENU)IDC_LPSECTORSPERCLUSTER, GetModuleHandle(NULL), NULL);

// Определения количества байт в секторе

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT(" Количество байт в секторе"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

20, 90, 300, 25, hWnd, (HMENU)IDC_LABEL3, GetModuleHandle(NULL), NULL);

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT("0"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

320, 90, 300, 25, hWnd, (HMENU)IDC_LPBYTESPERSECTOR, GetModuleHandle(NULL), NULL);

// Определение свободных кластеров на диске

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT(" Свободные кластеры на диске"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

20, 130, 300, 25, hWnd, (HMENU)IDC_LABEL4, GetModuleHandle(NULL), NULL);

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT("0"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

320, 130, 300, 25, hWnd, (HMENU)IDC_LPNUMBEROFFREECLUSTERS, GetModuleHandle(NULL), NULL);

// Определение общего количества кластеров

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT(" общее количество кластеров"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

20, 170, 300, 25, hWnd, (HMENU)IDC_LABEL5, GetModuleHandle(NULL), NULL);

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT("0"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

320, 170, 300, 25, hWnd, (HMENU)IDC_LPTOTALNUMBEROFCLUSTERS, GetModuleHandle(NULL), NULL);

// Определение свободного объема на диске

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT(" свободный объем на диске"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

20, 210, 300, 25, hWnd, (HMENU)IDC_LABEL6, GetModuleHandle(NULL), NULL);

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT("0"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

320, 210, 300, 25, hWnd, (HMENU)IDC_LPFREEBYTESAVAILABLE, GetModuleHandle(NULL), NULL);

// Определение общего объема диска

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT(" Общий объем диска"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

20, 250, 300, 25, hWnd, (HMENU)IDC_LABEL7, GetModuleHandle(NULL), NULL);

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT("0"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

320, 250, 300, 25, hWnd, (HMENU)IDC_LPTOTALNUMBEROFBYTES, GetModuleHandle(NULL), NULL);

//

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("BUTTON"), TEXT("Анализ"),

WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON|WS_TABSTOP,

320, 290, 200, 25, hWnd, (HMENU)IDC_BUTTON, GetModuleHandle(NULL), NULL);

break;

case WM_COMMAND:

wmId = LOWORD(wParam);

wmEvent = HIWORD(wParam);

// Разобрать выбор в меню:

switch (wmId)

{

case IDM_ABOUT:

DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);

break;

case IDM_EXIT:

DestroyWindow(hWnd);

break;

case IDC_BUTTON:

{

WCHAR lpRootPathName[50];

DWORD lpSectorsPerCluster;

DWORD lpBytesPerSector;

DWORD lpNumberOfFreeClusters;

DWORD lpTotalNumberOfClusters;

// получить название диска

GetDlgItemText(hWnd, IDC_LPROOTPATHNAME, lpRootPathName, 50);

// функция для кластера

GetDiskFreeSpace(

lpRootPathName,

&lpSectorsPerCluster,

&lpBytesPerSector,

&lpNumberOfFreeClusters,

&lpTotalNumberOfClusters

);

wchar_t szTemp[MAX_PATH];

swprintf(szTemp, L"%d сектор(а/ов)", lpSectorsPerCluster);

SetDlgItemText(hWnd, IDC_LPSECTORSPERCLUSTER, szTemp);

swprintf(szTemp, L"%d байт(а/ов)", lpBytesPerSector);

SetDlgItemText(hWnd, IDC_LPBYTESPERSECTOR, szTemp);

swprintf(szTemp, L"%d кластер(а/ов)", lpNumberOfFreeClusters);

SetDlgItemText(hWnd, IDC_LPNUMBEROFFREECLUSTERS, szTemp);

swprintf(szTemp, L"%d кластер(а/ов)", lpTotalNumberOfClusters);

SetDlgItemText(hWnd, IDC_LPTOTALNUMBEROFCLUSTERS, szTemp);

//

ULARGE_INTEGER lpFreeBytesAvailable;

ULARGE_INTEGER lpTotalNumberOfBytes;

ULARGE_INTEGER lpTotalNumberOfFreeBytes;

// функция для объема диска

GetDiskFreeSpaceEx(

lpRootPathName,

&lpFreeBytesAvailable,

&lpTotalNumberOfBytes,

&lpTotalNumberOfFreeBytes

);

swprintf(szTemp, L"%lld байт(а/ов)", lpFreeBytesAvailable);

SetDlgItemText(hWnd, IDC_LPFREEBYTESAVAILABLE, szTemp);

swprintf(szTemp, L"%lld байт(а/ов)", lpTotalNumberOfBytes);

SetDlgItemText(hWnd, IDC_LPTOTALNUMBEROFBYTES, szTemp);

break;

}

default:

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

}

break;

case WM_PAINT:

hdc = BeginPaint(hWnd, &ps);

EndPaint(hWnd, &ps);

break;

case WM_DESTROY:

PostQuitMessage(0);

break;

default:

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

}

return 0;

}

Лабораторная работа № 2

«Использование API функций Windows. Определение размера памяти и сопутствующих параметров».

Цель работы

Изучить основные требования к программированию функций Windows API для определения размеров памяти оперативной и физической памяти персонального компьютера.

Задание

Разработать программу, использующую стандартные функции API, для индикации следующих показателей системы:

Определение общего объема и доступной виртуальной памяти;

Определения общего объема и доступного размера файла подкачки;

Определение общего объема и доступной физической памяти.

Описание используемых API функций

Функция GlobalMemoryStatus из библиотеки Kernel32.dll предоставляет информацию об использовании физической и виртуальной памяти компьютера.

void WINAPI GlobalMemoryStatus(

_Out_ LPMEMORYSTATUSlpBuffer

);

Описание параметров представлено в следующей таблице:

Параметр

Описание

lpBuffer

Указатель на структуру Memorystatus

Тип данных LPMEMORYSTATUS - это указатель на структуру Memorystatus.

typedefstruct _MEMORYSTATUS {

DWORD dwLength

DWORD dwMemoryLoad;

DWORD dwTotalPhys;

DWORD dwAvailPhys;

DWORD dwTotalPageFile;

DWORD dwAvailPageFile;

DWORD dwTotalVirtual;

DWORD dwAvailVirtual;

} MEMORYSTATUS, *LPMEMORYSTATUS;

Описание членов структуры представлено в следующей таблице:

Член

Описание

dwLength

Размер структуры

dwMemoryLoad

Процент использования памяти

dwTotalPhys

Физическая память, байт

dwAvailPhys

Свободная физическая память, байт

dwTotalPageFile

Размер файла подкачки, байт

dwAvailPageFile

Свободных байт в файле подкачки

dwTotalVirtual

Виртуальная память, используемая процессом

dwAvailVirtual

Свободная виртуальная память

Функция не возвращает никаких значений.

Окно программы

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

// Lab2.cpp: определяет точку входа для приложения.

//

#include "stdafx.h"

#include "Lab2.h"

#define MAX_LOADSTRING 100

// Глобальные переменные:

HINSTANCE hInst;// текущий экземпляр

TCHAR szTitle[MAX_LOADSTRING];// Текст строки заголовка

TCHAR szWindowClass[MAX_LOADSTRING];// имя класса главного окна

// Отправить объявления функций, включенных в этот модуль кода:

ATOMMyRegisterClass(HINSTANCE hInstance);

BOOLInitInstance(HINSTANCE, int);

LRESULT CALLBACKWndProc(HWND, UINT, WPARAM, LPARAM);

INT_PTR CALLBACKAbout(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPTSTR lpCmdLine,

int nCmdShow)

{

UNREFERENCED_PARAMETER(hPrevInstance);

UNREFERENCED_PARAMETER(lpCmdLine);

// TODO: разместите код здесь.

MSG msg;

HACCEL hAccelTable;

// Инициализация глобальных строк

LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);

LoadString(hInstance, IDC_LAB2, szWindowClass, MAX_LOADSTRING);

MyRegisterClass(hInstance);

// Выполнить инициализацию приложения:

if (!InitInstance (hInstance, nCmdShow))

{

return FALSE;

}

hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_LAB2));

// Цикл основного сообщения:

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

{

if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}

return (int) msg.wParam;

}

// ФУНКЦИЯ: MyRegisterClass()

//

// НАЗНАЧЕНИЕ: регистрирует класс окна.

//

// КОММЕНТАРИИ:

//

// Эта функция и ее использование необходимы только в случае, если нужно, чтобы данный код

// был совместим с системами Win32, не имеющими функции RegisterClassEx'

// которая была добавлена в Windows 95. Вызов этой функции важен для того,

// чтобы приложение получило "качественные" мелкие значки и установило связь

// с ними.

//

ATOM MyRegisterClass(HINSTANCE hInstance)

{

WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style= CS_HREDRAW | CS_VREDRAW;

wcex.lpfnWndProc= WndProc;

wcex.cbClsExtra= 0;

wcex.cbWndExtra= 0;

wcex.hInstance= hInstance;

wcex.hIcon= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_LAB2));

wcex.hCursor= LoadCursor(NULL, IDC_ARROW);

wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);

wcex.lpszMenuName= MAKEINTRESOURCE(IDC_LAB2);

wcex.lpszClassName= szWindowClass;

wcex.hIconSm= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

return RegisterClassEx(&wcex);

}

//

// ФУНКЦИЯ: InitInstance(HINSTANCE, int)

//

// НАЗНАЧЕНИЕ: сохраняет обработку экземпляра и создает главное окно.

//

// КОММЕНТАРИИ:

//

// В данной функции дескриптор экземпляра сохраняется в глобальной переменной, а также

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

//

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)

{

HWND hWnd;

hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной

hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

if (!hWnd)

{

return FALSE;

}

ShowWindow(hWnd, nCmdShow);

UpdateWindow(hWnd);

return TRUE;

}

// ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)

//

// НАЗНАЧЕНИЕ: обрабатывает сообщения в главном окне.

//

// WM_COMMAND- обработка меню приложения

// WM_PAINT-Закрасить главное окно

// WM_DESTROY - ввести сообщение о выходе и вернуться.

//

//

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

int wmId, wmEvent;

PAINTSTRUCT ps;

HDC hdc;

switch (message)

{

case WM_CREATE:

// Размер структуры

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT(" Размер структуры"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

20, 10, 300, 25, hWnd, (HMENU)IDC_LABEL1, GetModuleHandle(NULL), NULL);

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT("0"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

320, 10, 200, 25, hWnd, (HMENU)IDC_DWLENGTH, GetModuleHandle(NULL), NULL);

// Процент использования памяти

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT(" Процент использования памяти"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

20, 50, 300, 25, hWnd, (HMENU)IDC_LABEL2, GetModuleHandle(NULL), NULL);

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT("0"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

320, 50, 200, 25, hWnd, (HMENU)IDC_DWMEMORYLOAD, GetModuleHandle(NULL), NULL);

// Определение общего объема физической памяти

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT(" Общий объем физической памяти"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

20, 90, 300, 25, hWnd, (HMENU)IDC_LABEL3, GetModuleHandle(NULL), NULL);

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT("0"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

320, 90, 200, 25, hWnd, (HMENU)IDC_DWTOTALPHYS, GetModuleHandle(NULL), NULL);

// Определение объема доступной физической памяти

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT(" Объем доступной физической памяти"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

20, 130, 300, 25, hWnd, (HMENU)IDC_LABEL4, GetModuleHandle(NULL), NULL);

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT("0"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

320, 130, 200, 25, hWnd, (HMENU)IDC_DWAVAILPHYS, GetModuleHandle(NULL), NULL);

// Определения общего объема размера файла подкачки

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT(" Общий объем размера файла подкачки"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

20, 170, 300, 25, hWnd, (HMENU)IDC_LABEL5, GetModuleHandle(NULL), NULL);

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT("0"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

320, 170, 200, 25, hWnd, (HMENU)IDC_DWTOTALPAGEFILE, GetModuleHandle(NULL), NULL);

// Определения объема доступного размера файла подкачки

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT(" Объем доступного размера файла подкачки"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

20, 210, 300, 25, hWnd, (HMENU)IDC_LABEL6, GetModuleHandle(NULL), NULL);

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT("0"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

320, 210, 200, 25, hWnd, (HMENU)IDC_DWAVAILPAGEFILE, GetModuleHandle(NULL), NULL);

// Определение общего объема виртуальной памяти

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT(" Общий объем виртуальной памяти"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

20, 250, 300, 25, hWnd, (HMENU)IDC_LABEL7, GetModuleHandle(NULL), NULL);

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT("0"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

320, 250, 200, 25, hWnd, (HMENU)IDC_DWTOTALVIRTUAL, GetModuleHandle(NULL), NULL);

// Определение объема доступной виртуальной памяти

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT(" Объем доступной виртуальной памяти"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

20, 290, 300, 25, hWnd, (HMENU)IDC_LABEL8, GetModuleHandle(NULL), NULL);

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT("0"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

320, 290, 200, 25, hWnd, (HMENU)IDC_DWAVAILVIRTUAL, GetModuleHandle(NULL), NULL);

//

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("BUTTON"), TEXT("Анализ"),

WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON|WS_TABSTOP,

220, 330, 300, 25, hWnd, (HMENU)IDC_BUTTON, GetModuleHandle(NULL), NULL);

break;

case WM_COMMAND:

wmId = LOWORD(wParam);

wmEvent = HIWORD(wParam);

// Разобрать выбор в меню:

switch (wmId)

{

case IDM_ABOUT:

DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);

break;

case IDM_EXIT:

DestroyWindow(hWnd);

break;

case IDC_BUTTON:

{

MEMORYSTATUS stat;

GlobalMemoryStatus (&stat);

wchar_t szTemp[MAX_PATH];

swprintf(szTemp, L"%lld байт(а/ов)", stat.dwLength);

SetDlgItemText(hWnd, IDC_DWLENGTH, szTemp);

swprintf(szTemp, L"%lld процент(а/ов)", stat.dwMemoryLoad);

SetDlgItemText(hWnd, IDC_DWMEMORYLOAD, szTemp);

swprintf(szTemp, L"%lld байт(а/ов)", stat.dwTotalPhys);

SetDlgItemText(hWnd, IDC_DWTOTALPHYS, szTemp);

swprintf(szTemp, L"%lld байт(а/ов)", stat.dwTotalPhys-stat.dwAvailPhys);

SetDlgItemText(hWnd, IDC_DWAVAILPHYS, szTemp);

swprintf(szTemp, L"%lld байт(а/ов)", stat.dwTotalPageFile);

SetDlgItemText(hWnd, IDC_DWTOTALPAGEFILE, szTemp);

swprintf(szTemp, L"%lld байт(а/ов)", stat.dwTotalPageFile-stat.dwAvailPageFile);

SetDlgItemText(hWnd, IDC_DWAVAILPAGEFILE, szTemp);

swprintf(szTemp, L"%lld байт(а/ов)", stat.dwTotalVirtual);

SetDlgItemText(hWnd, IDC_DWTOTALVIRTUAL, szTemp);

swprintf(szTemp, L"%lld байт(а/ов)", stat.dwTotalVirtual-stat.dwAvailVirtual);

SetDlgItemText(hWnd, IDC_DWAVAILVIRTUAL, szTemp);

break;

}

default:

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

}

break;

case WM_PAINT:

hdc = BeginPaint(hWnd, &ps);

// TODO: добавьте любой код отрисовки...

EndPaint(hWnd, &ps);

break;

case WM_DESTROY:

PostQuitMessage(0);

break;

default:

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

}

return 0;

}

Лабораторная работа № 3

«Работа с файловой системой с использованием функций API».

Цель работы

Изучить основные требования к программированию функций Windows API для определения свойств файлов, их размера, типа и их атрибутов.

Задание

Разработать программу, использующую стандартные функции API, для индикации следующих показателей файловой системы:

Определение типа файла;

Определения атрибутов файла;

Определение размера файла и времени его создания;

Определение времени открытия файла;

Определение времени последнего изменения.

Описание используемых API функций

1. Функция GetBinaryType выясняет, исполняемый ли это файл, и, если это так, то какой это исполняемый файл. Это последнее свойство обуславливает то, какой подсистемой исполняемый файл выполняется.

BOOL WINAPI GetBinaryType(

_In_ LPCTSTR lpApplicationName,

_Out_ LPDWORD lpBinaryType

);

Описание параметров представлено в следующей таблице:

Параметр

Описание

lpApplicationName

Указатель на символьную строку с нулем в конце, содержащая полный путь к файлу, двоичный тип которого выясняется

lpBinaryType

Указатель на переменную, которая получит информацию об исполняемом типе файла, указанного параметром lpApplicationName

Константы, определяющие типы, представлены в следующей таблице

Значение

Описание

SCS_32BIT_BINARY

32-разрядное базирующееся на Windows приложение

SCS_64BIT_BINARY

Windows XP: 64-разрядное базирующееся на Windows приложение

SCS_DOS_BINARY

Базирующееся на MS-DOS приложение

SCS_OS216_BINARY

16-разрядное базирующееся на OS/2 приложение

SCS_PIF_BINARY

PIF-файл, который исполняется базирующимся на MS-DOS приложением

SCS_POSIX_BINARY

Базирующееся на правилах POSIX приложение

SCS_WOW_BINARY

16-разрядное базирующееся на Windows приложение

Возвращаемые значения:

Если файл исполняется, возвращаемое значение - не ноль. Функция устанавливает переменную, на которую указывает параметр lpBinaryType, чтобы обозначить тип исполняемого файла.

Если функция не находит исполняемых файлов или, если функция завершается ошибкой, величина возвращаемого значения - ноль. Чтобы получить дополнительные данные об ошибке, вызов GetLastError.

2. Функция GetFileAttributes извлекает установленные атрибуты в стиле файловой системы FAT указанного файла или каталога.

DWORD WINAPI GetFileAttributes(

_In_ LPCTSTRlpFileName

);

Описание параметров представлено в следующей таблице:

Параметр

Описание

lpFileName

Указатель на символьную строку с нулем в конце, которая определяет имя файла или каталога

Возвращаемые значения

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

Если функция завершается ошибкой, возвращаемое значение - INVALID_FILE_ATTRIBUTES. Чтобы получить дополнительные данные об ошибке, вызов GetLastError.

Значения атрибутов представлены в следующей таблице:

Атрибут

Предназначение

FILE_ATTRIBUTE_ARCHIVE

Файл или каталог - архивные

FILE_ATTRIBUTE_COMPRESSED

Файл или каталог - сжатые

FILE_ATTRIBUTE_DEVICE

Зарезервировано

FILE_ATTRIBUTE_DIRECTORY

Дескриптор идентифицирует каталог

FILE_ATTRIBUTE_ENCRYPTED

Файл или каталог - зашифрованные

FILE_ATTRIBUTE_HIDDEN

Файл или каталог - скрытые

FILE_ATTRIBUTE_NORMAL

Файл или каталог не имеют других установленных атрибутов

FILE_ATTRIBUTE_NOT_CONTENT_INDEXED

Файл не будет индексирован содержащим индексы модулем обслуживания

FILE_ATTRIBUTE_OFFLINE

Данные файла доступны не сразу

FILE_ATTRIBUTE_READONLY

Файл или каталог только для чтения

FILE_ATTRIBUTE_REPARSE_POINT

Файл или каталог имеет связанную точку повторной обработки

FILE_ATTRIBUTE_SPARSE_FILE

Файл - разреженный

FILE_ATTRIBUTE_SYSTEM

Файл или каталог - частично или исключительно используются операционной системой

FILE_ATTRIBUTE_TEMPORARY

Файл используется для временного хранения.

3. Функция FindFirstFile ищет каталог файла или подкаталог, название которого соответствует указанному имени файла.

HANDLE WINAPI FindFirstFile(

_In_ LPCTSTR lpFileName,

_Out_ LPWIN32_FIND_DATA lpFindFileData

);

Описание параметров представлено в следующей таблице:

Параметр

Описание

lpFileName

Указатель на символьную строку с нулем в конце, которая определяет правильный каталог или путь и имя файла, которое может содержать символы подстановки (* и ?)

lpFindFileData

Указатель на структуру WIN32_FIND_DATA, которая получает информацию о найденном файле или вложенном каталоге

Структура WIN32_FIND_DATA описывает файл.

typedefstruct _WIN32_FIND_DATA {

DWORD dwFileAttributes;

FILETIME ftCreationTime;

FILETIME ftLastAccessTime;

FILETIME ftLastWriteTime;

DWORD nFileSizeHigh;

DWORD nFileSizeLow;

DWORD dwReserved0;

DWORD dwReserved1;

TCHAR cFileName[MAX_PATH];

TCHAR cAlternateFileName[14];

} WIN32_FIND_DATA, *PWIN32_FIND_DATA, *LPWIN32_FIND_DATA;

Описание членов структуры представлено в следующей таблице:

Член

Описание

dwFileAttributes

Атрибуты искомого файла

ftCreationTime

Структура FILETIME, которая устанавливается, когда файл или каталог создавались

ftLastAccessTime

Структура FILETIME устанавливает, когда последний раз читали из или писали в него или, в случае, если он исполняемый файл, запускали его

ftLastWriteTime

Структура FILETIME устанавливает, когда последний раз была запись в файл, он обрезался или переписывался

nFileSizeHigh

Старшее двойное слово (DWORD) значения размера файла, в байтах

dwReserved0

Если член структуры dwFileAttributes включает атрибут FILE_ATTRIBUTE_REPARSE_POINT, этот член структуры устанавливает тэг монтирования

dwReserved1

Зарезервированный для будущего использования

cFileName

Символьная строка с нулем в конце, которая устанавливает имя файла

cAlternateFileName

Символьная строка с нулем в конце, которая устанавливает альтернативное имя файла

Возвращаемые значения:

Если функция завершается успешно, возвращаемое значение - дескриптор поиска, используемый в последующем вызове функции FindNextFile или FindClose.

Если функция завершается ошибкой, возвращаемое значение - INVALID_HANDLE_VALUE. Чтобы получить дополнительные данные об ошибке, вызовите GetLastError.

4. Функция FileTimeToSystemTime преобразует файловое время в формат системного времени.

BOOL WINAPI FileTimeToSystemTime(

_In_ const FILETIME *lpFileTime,

_Out_ LPSYSTEMTIME lpSystemTime

);

Описание параметров представлено в следующей таблице:

Параметр

Описание

lpFileTime

Указатель на структуру FILETIME, содержащую файловое время, которое преобразуется в системные дату и формат времени

lpSystemTime

Указатель на структуру SYSTEMTIME, которая получает преобразованное файловое время

Возвращаемые значения:

Если функция завершается успешно, возвращаемое значение - не ноль.

Если функция завершается ошибкой, возвращаемое значение - ноль. Чтобы получить дополнительную информацию об ошибке, вызовите GetLastError.

Макет экрана

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

// Lab3.cpp: определяет точку входа для приложения.

#include "stdafx.h"

#include "Lab3.h"

#include <Commdlg.h>

#include <tchar.h>

#include <strsafe.h>

#define MAX_LOADSTRING 100

// Глобальные переменные:

HINSTANCE hInst;// текущий экземпляр

TCHAR szTitle[MAX_LOADSTRING];// Текст строки заголовка

TCHAR szWindowClass[MAX_LOADSTRING];// имя класса главного окна

// Отправить объявления функций, включенных в этот модуль кода:

ATOMMyRegisterClass(HINSTANCE hInstance);

BOOLInitInstance(HINSTANCE, int);

LRESULT CALLBACKWndProc(HWND, UINT, WPARAM, LPARAM);

INT_PTR CALLBACKAbout(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPTSTR lpCmdLine,

int nCmdShow)

{

UNREFERENCED_PARAMETER(hPrevInstance);

UNREFERENCED_PARAMETER(lpCmdLine);

// TODO: разместите код здесь.

MSG msg;

HACCEL hAccelTable;

// Инициализация глобальных строк

LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);

LoadString(hInstance, IDC_LAB3, szWindowClass, MAX_LOADSTRING);

MyRegisterClass(hInstance);

// Выполнить инициализацию приложения:

if (!InitInstance (hInstance, nCmdShow))

{

return FALSE;

}

hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_LAB3));

// Цикл основного сообщения:

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

{

if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}

return (int) msg.wParam;

}

// ФУНКЦИЯ: MyRegisterClass()

//

// НАЗНАЧЕНИЕ: регистрирует класс окна.

//

// КОММЕНТАРИИ:

//

// Эта функция и ее использование необходимы только в случае, если нужно, чтобы данный код

// был совместим с системами Win32, не имеющими функции RegisterClassEx'

// которая была добавлена в Windows 95. Вызов этой функции важен для того,

// чтобы приложение получило "качественные" мелкие значки и установило связь

// с ними.

//

ATOM MyRegisterClass(HINSTANCE hInstance)

{

WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style= CS_HREDRAW | CS_VREDRAW;

wcex.lpfnWndProc= WndProc;

wcex.cbClsExtra= 0;

wcex.cbWndExtra= 0;

wcex.hInstance= hInstance;

wcex.hIcon= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_LAB3));

wcex.hCursor= LoadCursor(NULL, IDC_ARROW);

wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);

wcex.lpszMenuName= MAKEINTRESOURCE(IDC_LAB3);

wcex.lpszClassName= szWindowClass;

wcex.hIconSm= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

return RegisterClassEx(&wcex);

}

//

// ФУНКЦИЯ: InitInstance(HINSTANCE, int)

//

// НАЗНАЧЕНИЕ: сохраняет обработку экземпляра и создает главное окно.

//

// КОММЕНТАРИИ:

//

// В данной функции дескриптор экземпляра сохраняется в глобальной переменной, а также

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

//

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)

{

HWND hWnd;

hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной

hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

if (!hWnd)

{

return FALSE;

}

ShowWindow(hWnd, nCmdShow);

UpdateWindow(hWnd);

return TRUE;

}

// ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)

//

// НАЗНАЧЕНИЕ: обрабатывает сообщения в главном окне.

//

// WM_COMMAND- обработка меню приложения

// WM_PAINT-Закрасить главное окно

// WM_DESTROY - ввести сообщение о выходе и вернуться.

//

//

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

int wmId, wmEvent;

PAINTSTRUCT ps;

HDC hdc;

switch (message)

{

case WM_CREATE:

// Определение типа файла

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT(" Тип файла"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

20, 10, 300, 25, hWnd, (HMENU)IDC_LABEL1, GetModuleHandle(NULL), NULL);

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), TEXT(""),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

320, 10, 400, 25, hWnd, (HMENU)IDC_BINARYTYPE, GetModuleHandle(NULL), NULL);

// Определения атрибутов файла

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT(" Атрибуты файла"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

20, 50, 300, 25, hWnd, (HMENU)IDC_LABEL2, GetModuleHandle(NULL), NULL);

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), TEXT(""),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

320, 50, 400, 25, hWnd, (HMENU)IDC_FILEATTRIBUTES, GetModuleHandle(NULL), NULL);

// Определения размера файла

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT(" Размер файла"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

20, 90, 300, 25, hWnd, (HMENU)IDC_LABEL3, GetModuleHandle(NULL), NULL);

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), TEXT(""),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

320, 90, 400, 25, hWnd, (HMENU)IDC_FILESIZE, GetModuleHandle(NULL), NULL);

// Определения времени создания файла

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT(" Время создания файла"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

20, 130, 300, 25, hWnd, (HMENU)IDC_LABEL4, GetModuleHandle(NULL), NULL);

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), TEXT(""),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

320, 130, 400, 25, hWnd, (HMENU)IDC_FILECREATIONTIME, GetModuleHandle(NULL), NULL);

// Определение времени открытия файла

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT(" Время открытия файла"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

20, 170, 300, 25, hWnd, (HMENU)IDC_LABEL5, GetModuleHandle(NULL), NULL);

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), TEXT(""),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

320, 170, 400, 25, hWnd, (HMENU)IDC_FILELASTACCESSTIME, GetModuleHandle(NULL), NULL);

// Определение времени последнего изменения

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT(" Время последнего изменения файла"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

20, 210, 300, 25, hWnd, (HMENU)IDC_LABEL6, GetModuleHandle(NULL), NULL);

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("EDIT"), TEXT(""),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

320, 210, 400, 25, hWnd, (HMENU)IDC_FILELASTWRITETIME, GetModuleHandle(NULL), NULL);

//

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT(""),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

20, 250, 700, 25, hWnd, (HMENU)IDC_LABEL7, GetModuleHandle(NULL), NULL);

//

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("BUTTON"), TEXT("Обзор..."),

WS_CHILD|WS_VISIBLE|BS_DEFPUSHBUTTON|WS_TABSTOP,

320, 290, 200, 25, hWnd, (HMENU)IDC_BUTTON, GetModuleHandle(NULL), NULL);

break;

case WM_COMMAND:

wmId = LOWORD(wParam);

wmEvent = HIWORD(wParam);

// Разобрать выбор в меню:

switch (wmId)

{

case IDM_ABOUT:

DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);

break;

case IDM_EXIT:

DestroyWindow(hWnd);

break;

case IDC_BUTTON:

{

wchar_t szTemp[MAX_PATH];

OPENFILENAME ofn;

WCHAR szFileName[250];

WCHAR szFilter[] = TEXT("Все файлы\0*.*\0\0");

ZeroMemory(&ofn,sizeof(OPENFILENAME));

ofn.lStructSize = sizeof(OPENFILENAME);

ofn.hInstance = hInst;

ofn.hwndOwner = hWnd;

ofn.lpstrFilter = szFilter;

ofn.lpstrFile = szFileName;

ofn.nMaxFile = sizeof(szFileName);

ofn.Flags = OFN_FILEMUSTEXIST | OFN_PATHMUSTEXIST;

if(GetOpenFileName(&ofn))

{

//

SetDlgItemText(hWnd, IDC_LABEL7, szFileName);

// Определение типа файла

DWORD lpBinaryType;

GetBinaryType(

szFileName,

&lpBinaryType

);

switch(lpBinaryType)

{

case SCS_32BIT_BINARY:

SetDlgItemText(hWnd, IDC_BINARYTYPE, _T("32-разрядное базирующееся на Windows приложение"));

break;

case SCS_64BIT_BINARY:

SetDlgItemText(hWnd, IDC_BINARYTYPE, _T("Windows XP: 64-разрядное базирующееся на Windows приложение"));

break;

case SCS_DOS_BINARY:

SetDlgItemText(hWnd, IDC_BINARYTYPE, _T("Базирующееся на MS-DOS приложение"));

break;

case SCS_OS216_BINARY:

SetDlgItemText(hWnd, IDC_BINARYTYPE, _T("16-разрядное базирующееся на OS/2 приложение"));

break;

case SCS_PIF_BINARY:

SetDlgItemText(hWnd, IDC_BINARYTYPE, _T("PIF-файл, который исполняется базирующимся на MS-DOS приложением"));

break;

case SCS_POSIX_BINARY:

SetDlgItemText(hWnd, IDC_BINARYTYPE, _T("Базирующееся на правилах POSIX приложение"));

break;

case SCS_WOW_BINARY:

SetDlgItemText(hWnd, IDC_BINARYTYPE, _T("16-разрядное базирующееся на Windows приложение"));

break;

default:

SetDlgItemText(hWnd, IDC_BINARYTYPE, _T("<неизвестный тип>"));

break;

}

// Определения атрибутов файла

DWORD attribute = GetFileAttributes(szFileName);

switch(attribute)

{

case FILE_ATTRIBUTE_ARCHIVE:

SetDlgItemText(hWnd, IDC_FILEATTRIBUTES, _T("Файл или каталог - архивные"));

break;

case FILE_ATTRIBUTE_COMPRESSED:

SetDlgItemText(hWnd, IDC_FILEATTRIBUTES, _T("Файл или каталог - сжатые"));

break;

case FILE_ATTRIBUTE_DEVICE:

SetDlgItemText(hWnd, IDC_FILEATTRIBUTES, _T("Зарезервировано"));

break;

case FILE_ATTRIBUTE_DIRECTORY:

SetDlgItemText(hWnd, IDC_FILEATTRIBUTES, _T("Дескриптор идентифицирует каталог"));

break;

case FILE_ATTRIBUTE_ENCRYPTED:

SetDlgItemText(hWnd, IDC_FILEATTRIBUTES, _T("Файл или каталог - зашифрованные"));

break;

case FILE_ATTRIBUTE_HIDDEN:

SetDlgItemText(hWnd, IDC_FILEATTRIBUTES, _T("Файл или каталог - скрытые"));

break;

case FILE_ATTRIBUTE_NORMAL:

SetDlgItemText(hWnd, IDC_FILEATTRIBUTES, _T("Файл или каталог не имеют других установленных атрибутов"));

break;

case FILE_ATTRIBUTE_NOT_CONTENT_INDEXED:

SetDlgItemText(hWnd, IDC_FILEATTRIBUTES, _T("Файл не будет индексирован содержащим индексы модулем обслуживания"));

break;

case FILE_ATTRIBUTE_OFFLINE:

SetDlgItemText(hWnd, IDC_FILEATTRIBUTES, _T("Данные файла доступны не сразу"));

break;

case FILE_ATTRIBUTE_READONLY:

SetDlgItemText(hWnd, IDC_FILEATTRIBUTES, _T("Файл или каталог только для чтения"));

break;

case FILE_ATTRIBUTE_REPARSE_POINT:

SetDlgItemText(hWnd, IDC_FILEATTRIBUTES, _T("Файл или каталог имеет связанную точку повторной обработки"));

break;

case FILE_ATTRIBUTE_SPARSE_FILE:

SetDlgItemText(hWnd, IDC_FILEATTRIBUTES, _T("Файл - разреженный"));

break;

case FILE_ATTRIBUTE_SYSTEM:

SetDlgItemText(hWnd, IDC_FILEATTRIBUTES, _T("Файл или каталог - частично или исключительно используются операционной системой"));

break;

case FILE_ATTRIBUTE_TEMPORARY:

SetDlgItemText(hWnd, IDC_FILEATTRIBUTES, _T("Файл используется для временного хранения."));

break;

default:

SetDlgItemText(hWnd, IDC_FILEATTRIBUTES, _T("<неизвестный атрибут>"));

break;

}

// Определение размера файла и времени его создания;

// Определение времени открытия файла;

// Определение времени последнего изменения.

WIN32_FIND_DATA lpFindFileData;

FindFirstFile(

szFileName,

&lpFindFileData);

swprintf(szTemp, L"%d байт(а/ов)", (lpFindFileData.nFileSizeHigh * (MAXDWORD+1)) + lpFindFileData.nFileSizeLow);

SetDlgItemText(hWnd, IDC_FILESIZE, szTemp);

SYSTEMTIME stUTC, stLocal;

FileTimeToSystemTime(&lpFindFileData.ftCreationTime, &stUTC);

SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal);

swprintf(szTemp, L"%02d/%02d/%d %02d:%02d", stLocal.wMonth, stLocal.wDay, stLocal.wYear, stLocal.wHour, stLocal.wMinute);

SetDlgItemText(hWnd, IDC_FILECREATIONTIME, szTemp);

FileTimeToSystemTime(&lpFindFileData.ftLastAccessTime, &stUTC);

SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal);

swprintf(szTemp, L"%02d/%02d/%d %02d:%02d", stLocal.wMonth, stLocal.wDay, stLocal.wYear, stLocal.wHour, stLocal.wMinute);

SetDlgItemText(hWnd, IDC_FILELASTACCESSTIME, szTemp);

FileTimeToSystemTime(&lpFindFileData.ftLastWriteTime, &stUTC);

SystemTimeToTzSpecificLocalTime(NULL, &stUTC, &stLocal);

swprintf(szTemp, L"%02d/%02d/%d %02d:%02d", stLocal.wMonth, stLocal.wDay, stLocal.wYear, stLocal.wHour, stLocal.wMinute);

SetDlgItemText(hWnd, IDC_FILELASTWRITETIME, szTemp);

}

break;

}

default:

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

}

break;

case WM_PAINT:

hdc = BeginPaint(hWnd, &ps);

// TODO: добавьте любой код отрисовки...

EndPaint(hWnd, &ps);

break;

case WM_DESTROY:

PostQuitMessage(0);

break;

default:

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

}

return 0;

}

Лабораторная работа № 4

«Логика организации программ СПО».

Цель работы

Раскрыть механизмы передачи управления в программе для логических сравнений и программной организации.

Задание

Написать программу для вычисления чисел Фибоначчи 1,1,2,3,5,8,13,...т.е., где каждое число в последовательности представляет собой сумму двух предыдущих чисел. По нажатию клавиши «пробел» каждое последующее число выводится на экран. Необходимо организовать показ с использованием обновления экрана. Суммы должны вычисляться в подпрограммах.

Числа Фибоначчи

Индекс

0

1

2

3

4

5

6

7

8

Значение

1

1

2

3

5

8

13

21

34

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

Окно программы

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

// Lab4.cpp: определяет точку входа для приложения.

//

#include "stdafx.h"

#include "Lab4.h"

#define MAX_LOADSTRING 100

// Глобальные переменные:

HINSTANCE hInst;// текущий экземпляр

TCHAR szTitle[MAX_LOADSTRING];// Текст строки заголовка

TCHAR szWindowClass[MAX_LOADSTRING];// имя класса главного окна

int Fib[100];

int n;

// Отправить объявления функций, включенных в этот модуль кода:

ATOMMyRegisterClass(HINSTANCE hInstance);

BOOLInitInstance(HINSTANCE, int);

LRESULT CALLBACKWndProc(HWND, UINT, WPARAM, LPARAM);

INT_PTR CALLBACKAbout(HWND, UINT, WPARAM, LPARAM);

int APIENTRY _tWinMain(HINSTANCE hInstance,

HINSTANCE hPrevInstance,

LPTSTR lpCmdLine,

int nCmdShow)

{

UNREFERENCED_PARAMETER(hPrevInstance);

UNREFERENCED_PARAMETER(lpCmdLine);

// TODO: разместите код здесь.

MSG msg;

HACCEL hAccelTable;

// Инициализация глобальных строк

LoadString(hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING);

LoadString(hInstance, IDC_LAB4, szWindowClass, MAX_LOADSTRING);

MyRegisterClass(hInstance);

// Выполнить инициализацию приложения:

if (!InitInstance (hInstance, nCmdShow))

{

return FALSE;

}

hAccelTable = LoadAccelerators(hInstance, MAKEINTRESOURCE(IDC_LAB4));

// Цикл основного сообщения:

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

{

if (!TranslateAccelerator(msg.hwnd, hAccelTable, &msg))

{

TranslateMessage(&msg);

DispatchMessage(&msg);

}

}

return (int) msg.wParam;

}

//

// ФУНКЦИЯ: MyRegisterClass()

//

// НАЗНАЧЕНИЕ: регистрирует класс окна.

//

// КОММЕНТАРИИ:

//

// Эта функция и ее использование необходимы только в случае, если нужно, чтобы данный код

// был совместим с системами Win32, не имеющими функции RegisterClassEx'

// которая была добавлена в Windows 95. Вызов этой функции важен для того,

// чтобы приложение получило "качественные" мелкие значки и установило связь

// с ними.

//

ATOM MyRegisterClass(HINSTANCE hInstance)

{

WNDCLASSEX wcex;

wcex.cbSize = sizeof(WNDCLASSEX);

wcex.style= CS_HREDRAW | CS_VREDRAW;

wcex.lpfnWndProc= WndProc;

wcex.cbClsExtra= 0;

wcex.cbWndExtra= 0;

wcex.hInstance= hInstance;

wcex.hIcon= LoadIcon(hInstance, MAKEINTRESOURCE(IDI_LAB4));

wcex.hCursor= LoadCursor(NULL, IDC_ARROW);

wcex.hbrBackground= (HBRUSH)(COLOR_WINDOW+1);

wcex.lpszMenuName= MAKEINTRESOURCE(IDC_LAB4);

wcex.lpszClassName= szWindowClass;

wcex.hIconSm= LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));

return RegisterClassEx(&wcex);

}

//

// ФУНКЦИЯ: InitInstance(HINSTANCE, int)

//

// НАЗНАЧЕНИЕ: сохраняет обработку экземпляра и создает главное окно.

//

// КОММЕНТАРИИ:

//

// В данной функции дескриптор экземпляра сохраняется в глобальной переменной, а также

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

//

BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)

{

HWND hWnd;

hInst = hInstance; // Сохранить дескриптор экземпляра в глобальной переменной

hWnd = CreateWindow(szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,

CW_USEDEFAULT, 0, CW_USEDEFAULT, 0, NULL, NULL, hInstance, NULL);

if (!hWnd)

{

return FALSE;

}

ShowWindow(hWnd, nCmdShow);

UpdateWindow(hWnd);

Fib[0] = 1;

Fib[1] = 1;

n=2;

return TRUE;

}

//

// ФУНКЦИЯ: WndProc(HWND, UINT, WPARAM, LPARAM)

//

// НАЗНАЧЕНИЕ: обрабатывает сообщения в главном окне.

//

// WM_COMMAND- обработка меню приложения

// WM_PAINT-Закрасить главное окно

// WM_DESTROY - ввести сообщение о выходе и вернуться.

//

//

LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)

{

int wmId, wmEvent;

PAINTSTRUCT ps;

HDC hdc;

switch (message)

{

case WM_KEYDOWN:

switch (wParam)

{

case 32: // пробел

{

if (n>=40)

break;

Fibonacci(Fib, &n);

wchar_t szTemp[MAX_PATH];

swprintf(szTemp, L"Индекс элемента: %d", n-1);

SetDlgItemText(hWnd, IDC_LABEL1, szTemp);

swprintf(szTemp, L"Значение элемента: %d", Fib[n-1]);

SetDlgItemText(hWnd, IDC_LABEL2, szTemp);

break;

}

}

break;

case WM_CREATE:

//

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT("Индекс элемента: 1"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

20, 10, 300, 25, hWnd, (HMENU)IDC_LABEL1, GetModuleHandle(NULL), NULL);

CreateWindowEx(WS_EX_CLIENTEDGE, TEXT("STATIC"), TEXT("Значение элемента: 1"),

WS_CHILD|WS_VISIBLE|ES_AUTOHSCROLL|WS_TABSTOP,

20, 50, 300, 25, hWnd, (HMENU)IDC_LABEL2, GetModuleHandle(NULL), NULL);

break;

case WM_COMMAND:

wmId = LOWORD(wParam);

wmEvent = HIWORD(wParam);

// Разобрать выбор в меню:

switch (wmId)

{

case IDM_ABOUT:

DialogBox(hInst, MAKEINTRESOURCE(IDD_ABOUTBOX), hWnd, About);

break;

case IDM_EXIT:

DestroyWindow(hWnd);

break;

default:

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

}

break;

case WM_PAINT:

hdc = BeginPaint(hWnd, &ps);

// TODO: добавьте любой код отрисовки...

EndPaint(hWnd, &ps);

break;

case WM_DESTROY:

PostQuitMessage(0);

break;

default:

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

}

return 0;

}

// Обработчик сообщений для окна "О программе".

INT_PTR CALLBACK About(HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)

{

UNREFERENCED_PARAMETER(lParam);

switch (message)

{

case WM_INITDIALOG:

return (INT_PTR)TRUE;

case WM_COMMAND:

if (LOWORD(wParam) == IDOK || LOWORD(wParam) == IDCANCEL)

{

EndDialog(hDlg, LOWORD(wParam));

return (INT_PTR)TRUE;

}

break;

}

return (INT_PTR)FALSE;

}

//

void Fibonacci(int* Fib, int* n)

{

Fib[*n] = Fib[*n-2] + Fib[*n-1];

*n = *n+1;

}

Лабораторная работа № 5

«Интерфейс Ассемблера с языками высокого уровня»

Цель работы

Изучить механизмы организации связи программ на С# и программ на ассемблере, взаимное использование функций и переменных.

Задание

память файл переменная программа

Написать на языке С# Ассемблер программу, выполняющую следующие действия:

Сейчас МЫ находимся в С++

Введите три числа:

10 20 30

Сейчас находимся в ASSEMBLERE и складываем эти три числа

Нажмите любую клавишу для перехода в C++

Перешли в С++

Сумма чисел равна: 60

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

файл lr5.asm

PUBLIC C adding

EXTRN _printf, _getch, _a:word

_data segment public 'data'

text1 db 'Сейчас находимся в ASSEMBLERE и складываем эти три числа',10

text2 db 20, 30, 'Нажмите любую клавишу для перехода в C++', 0

_data ends

_text segment public 'code'

assume cs:_text

adding proc near

push bp

mov bp,sp

push offset text1

call near ptr _printf

add sp,2

xor ax,ax

mov ax,_a

add ax,[bp+4]

add ax,[bp+6]

push ax

push offset text2

call near ptr _printf

add sp,2

call near ptr _getch

pop ax

pop bp

ret

adding endp

_text ends

end

Файл lr5.cpp

using System;

using System.Collections.Generic;

using System.Text;

namespace ConsoleApplication1

{

class Program

{

static int a;

static void Main(string[] args)

{

int b, c, summ;

Console.Clear();

Console.WriteLine("Mi v pope");

Console.WriteLine("Tri chisla");

a = Convert.ToInt32(Console.ReadLine());

b = Convert.ToInt32(Console.ReadLine());

c = Convert.ToInt32(Console.ReadLine());

summ = b + c;

Console.WriteLine("Mi ne v pope");

Console.WriteLine("Summa " + summ.ToString());

Console.ReadKey();

}

}

}

Размещено на Allbest.ru


Подобные документы

  • Классификация компьютерной памяти. Использование оперативной, статической и динамической оперативной памяти. Принцип работы DDR SDRAM. Форматирование магнитных дисков. Основная проблема синхронизации. Теория вычислительных процессов. Адресация памяти.

    курсовая работа [1,5 M], добавлен 28.05.2016

  • Особенности инициализации регистров для дисковых операций чтения, записи и верификации. Анализ метода доступа к дисковой памяти, поддерживающей использование оглавления, блокирование и разблокирование записей. Обеспечение адресации дисковых секторов.

    лабораторная работа [43,4 K], добавлен 20.11.2012

  • Сущность понятий: "куча" (пул памяти), связный список, синхронизация потоков; разработка программы, исключающей возможность перекрытия потоков друг другом. Организация связных списков и использование функций API для работы с пулом памяти в ОС Windows.

    курсовая работа [145,3 K], добавлен 11.05.2012

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

    презентация [976,8 K], добавлен 21.05.2019

  • Описание используемых в программе операторов, процедур, функций. Директива include. Правила объявления и определения функций в СИ++. Блок-схема алгоритма программы. Подпрограммы чтения из файла и записи в файл. Использование заголовочных файлов.

    курсовая работа [346,8 K], добавлен 26.04.2012

  • Анализ работы параллельных вычислений на видеокарте GeForce GT 540M с использованием текстурной памяти. Рассмотрение специфических особенностей по адресации текстурной памяти. Изучение основ чтения и записи данных. Описание примеров данных программ.

    лабораторная работа [3,1 M], добавлен 04.12.2014

  • Спецификатор класса памяти в объявлении переменной, ее область действия как часть программы или исходного модуля. Определение видимости переменных и функций в программе. Продолжительность жизни, виды моделей памяти. Передача параметров и массивов.

    лабораторная работа [62,2 K], добавлен 06.07.2009

  • Сравнение различных способов обхода данных. Заполнение массива для случайного обхода. Изучение понятия кэш-памяти, ее основных размеров и функций. Оптимальный и неоптимальный алгоритм умножения двух матриц с точки зрения порядка обхода данных в памяти.

    презентация [94,7 K], добавлен 02.06.2013

  • Простейшая схема взаимодействия оперативной памяти с ЦП. Устройство и принципы функционирования оперативной памяти. Эволюция динамической памяти. Модуль памяти EDO-DRAM BEDO (Burst EDO) - пакетная EDO RAM. Модуль памяти SDRAM, DDR SDRAM, SDRAM II.

    реферат [16,1 K], добавлен 13.12.2009

  • Расчет количества израсходованного топлива и веса перевезенного груза каждым водителем. Межтабличные связи для автоматического формирования ведомости расхода топлива. Классификации и основные характеристики основных видов памяти персонального компьютера.

    контрольная работа [1,3 M], добавлен 05.06.2014

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.