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