Работа с дисками с использованием функций 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