Системное программирование >

Системное программирование

2020-2021 учебный год

Практические занятия

Практика 15
Копирование файлов с использованием WinAPI

Пример 1

#include "StdAfx.h"
#include <windows.h>
#include <windowsx.h>
LONG WINAPI WndProc(HWND, UINT, WPARAM, LPARAM); // функция обработки сообщений окна

const TCHAR szOutFileName[] = L"output.txt";
const TCHAR szInFileName[] = L"input.txt";
const TCHAR szErrMsg[] = L"Error: File not found!";

// Стартовая функция
int WINAPI WinMain(HINSTANCE hInstance,
	HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
	HWND hwnd; // дескриптор окна
	MSG msg; // структура сообщения
	WNDCLASS w; // структура класса окна
	memset(&w, 0, sizeof(WNDCLASS)); // очистка памяти для структуры
	w.style = CS_HREDRAW | CS_VREDRAW;
	w.lpfnWndProc = WndProc;
	w.hInstance = hInstance;
	w.hbrBackground = CreateSolidBrush(0x00FFFFFF);
	w.lpszClassName = L"MyClass";
	RegisterClass(&w); // регистрация класса окна
	// Создание окна
	hwnd = CreateWindow(L"MyClass", L"Test Main Window v0.2",
		WS_OVERLAPPEDWINDOW,
		500, 200, 400, 200,
		NULL, NULL, hInstance, NULL);
	ShowWindow(hwnd, nCmdShow); // отображение окна
	UpdateWindow(hwnd); // перерисовка окна
	// Цикл обработки сообщений
	while (GetMessage(&msg, NULL, 0, 0)) {
		TranslateMessage(&msg);
		DispatchMessage(&msg);
	}
	return msg.wParam;
}
// Функция обработки сообщений
LONG WINAPI WndProc(HWND hwnd, UINT Message,
	WPARAM wparam, LPARAM lparam) {
	HDC hdc;
	HINSTANCE hInst;
	PAINTSTRUCT ps;
	static HWND hBtn; // дескриптор кнопки
	static HWND hStat; // дескриптор статического текста
	int a, b;
	DWORD dwTemp;
	switch (Message) {
	case WM_CREATE: // сообщение создания окна
		hInst = ((LPCREATESTRUCT)lparam)->hInstance; // дескриптор приложения
		// Создаем и показываем первое поле редактирования
		// Создаем и показываем кнопку
		hBtn = CreateWindow(L"button", L"Start",
			WS_CHILD | WS_VISIBLE | WS_BORDER,
			130, 50, 120, 30, hwnd, 0, hInst, NULL);
		ShowWindow(hBtn, SW_SHOWNORMAL);
		// Создаем и показываем поле текста для результата
		hStat = CreateWindow(L"static", L"0", WS_CHILD | WS_VISIBLE,
			80, 100, 220, 20, hwnd, 0, hInst, NULL);
		ShowWindow(hStat, SW_SHOWNORMAL);
		break;
	case WM_COMMAND: // сообщение о команде
		if (lparam == (LPARAM)hBtn) // если нажали на кнопку
		{
			SetWindowText(hStat, L"Start: Clicked."); // выводим результат в статическое поле
			/*
			HANDLE hFile = CreateFile(szOutFileName, GENERIC_WRITE, 0, NULL,
			CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
			if (INVALID_HANDLE_VALUE == hFile) {
			return 1;
			}
			a = 0xFF;
			WriteFile(hFile, &a, sizeof(a), &dwTemp, NULL);
			CloseHandle(hFile);
			*/

			HANDLE hFile = CreateFile(szInFileName, GENERIC_READ, 0, NULL,
				OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
			if (INVALID_HANDLE_VALUE == hFile) {
				SetWindowText(hStat, szErrMsg);
				return 1;
			}
			ReadFile(hFile, &a, sizeof(a), &dwTemp, NULL);
			if (sizeof(a) != dwTemp) {
				CloseHandle(hFile);
				return 1;
			}
			CloseHandle(hFile);
		}
		break;
	case WM_PAINT: // перерисовка окна
		hdc = BeginPaint(hwnd, &ps); // начало перерисовки
		TextOut(hdc, 120, 10, L"Test Button Start", 18); // вывод текстовых сообщений
		EndPaint(hwnd, &ps); // конец перерисовки
		break;
	case WM_DESTROY: // закрытие окна
		PostQuitMessage(0);
		break;
	default: // обработка сообщения по умолчанию
		return DefWindowProc(hwnd, Message, wparam, lparam);
	}
	return 0;
}


1. Передать через аргументы командной строки имя файла-источника 
   и название файла-приемника. Вывести имена файлов в консоли. 

2. Выполнить копирование 1-го текстового и 1-го бинарного файлов 
   с использованием готовой функции копирования файлов
   из библитоеки API Win32.

3. Выполнить копирование 1-го текстового и 1-го бинарного файлов 
   без использования готовой функции копирования файлов
   c применением поблочного копирования с помощью функций 
   FileRead() и FileWrite() из библитоеки API Win32.

4. Изучить пример создания в API Win32 графического 
   окна приложения с кнопкой и статической надписью. 
   Настройте IDE Microsof Visual Studio для разработки 
   программ на языке программирования C, без использования C++.

5. Добаваить в приложение из примера кнопки Start И Stop.
   Обработчики кнопок должны выводить в статическую 
   надпись текст "Button clicked: Start" и "Button clicked: Stop"
   соответственно.

Справка:
Программирование на Си в Linux

Основные команды:
ls -l
mcedit test1.c
gcc test1.c
./a.out

1. Запуск Oracle VM VirtualBox.
2. Старт ubuntu2020_113.
3. Запуск Terminal.
4. В папке /home/test создать текстовый файл
в текстовом редакторе mcedit:
mcedit test.c
5. Набрать test.c, сохранить F2, выход из редактора F10.
#include <stdio.h>
int main() {
  printf("Test1 OK");
  return 0;
}

5. В теримнале перейти в папку /home/test:
cd ~/test
6. Проверить по списку файлов в папке наличие файла test.c.
В терминале вывести список файлов:
ls -l
7. В терминале cкомпилировать файл test.c
gcc test.c
8. Проверить по списку файлов, что после компиляции 
в папке test появился новый файл a.out.
В терминале вывести список файлов:
ls -l
9. Запустить на исполнение файл a.out.
В терминале набрать команду:
./a.out

Работа в консоли
1. Переключение в консоль: Ctrl + F3 или Alt + F3.
2. Возвращение в xWindow: Alt + F7

Компиляция в 2 этапа
gcc -c test.c
gcc test.o -o myprog1
./myprog1

Установка коллекции компиляторов GNU Compiler Collection, GCC.
sudo apt update
sudo apt upgrade
sudo apt install build-essential

Установка файлового менеджера Midnight Commander, mc, редактора mcedit
sudo apt update
sudo apt upgrade
sudo apt install mc

  1. PDF stolyarov.info — Программирование: введение в профессию. Том 2: низкоуровневое программирование.
  2. stolyarov.info — Программирование: введение в профессию. Том 2: низкоуровневое программирование.
  3. stolyarov.info — Основы программирования.
  4. stolyarov.info — Основы программирования.
  5. cs.mipt.ru — Хирьянов Т.Ф. Адреса и указатели в Си. Адресная арифметика.
  6. ru.cppreference.com — Справка по языкам программирования C и C++.
  7. znanium.com — Бабаев С.И. Операционные системы. Лабораторный практикум : учеб. пособие / С.И. Бабаев, С.В. Засорин. — М. : КУРС, 2018. — 240 с.