Редактор буфера обмена
Дипломная работа - Компьютеры, программирование
Другие дипломы по предмету Компьютеры, программирование
?ункции, предназначенные для работы с буфером обмена, но они в проекте не используются и в подробном рассмотрении не нуждаются.
Другие WIN API функции используемые в проекте:
LPVOID WINAPI GlobalLock (HGLOBAL hMem);
Блокирует объект в памяти и возвращает указатель на его первый байт.
BOOL WINAPI GlobalUnlock (HGLOBAL hMem);
Разблокирует ранее заблокированный объект. В случае удачного завершения возвращает не нулевое значение.
UINT DragQueryFile (HDROP hDrop, UINT iFile, LPTSTR lpszFile, UINT cch);
Используется мной для перечисления имён файлов, скопированных в буфер обмена (в том случае, если скопированы файлы, а не их части), т.е. когда формат буфера обмена равен константе, CF_HDROP.
HANDLE WINAPI CreateFile (LPCTSTR lpFileName, DWORD dwDesiredAccess, dwShareMode, LPSECURITY_ATTRIBUTES lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, opt HANDLE hTemplateFile);
Создаёт файл с заданным именем (первый параметр) и открывает его. Мной используется для создания временных файлов, которые потом удаляются.
BOOL WINAPI DeleteFile (LPCTSTR lpFileName);
Удаляет файл с заданным именем.
BOOL WINAPI WriteFile / ReadFile
Имеют схожие параметры. Служат для записи в файл и для чтения из него.
BOOL WINAPI CreateProcess();
Создаёт процесс. Используется мною для открытия текстового или графического редакторов.
DWORD WINAPI WaitForSingleObject (HANDLE hHandle, DWORD dwMilliseconds);
Функция, которая переводит поток, вызвавший её в ожидание сообщения от объекта hHandle. Используется в проекте для ожидания завершения редактирования.
HANDLE WINAPI CreateThread (LPSECURITY_ATTRIBUTES lpThreadAttributes, SIZE_T dwStackSize, LPTHREAD_START_ROUTINE lpStartAddress, LPVOID lpParameter, DWORD dwCreationFlags, LPDWORD lpThreadId);
Создаёт поток в виртуальном адресном пространстве процесса. Параметр lpStartAddress является указателем на функцию определённого вида.
BOOL WINAPI CloseHandle (HANDLE hObject);
Закрывает открытый ранее дескриптор. При удачном завершении возвращает ненулевое значение.
2. Разработка и реализация программы
2.1 Модульная структура программы
Программа содержит три модуля, а модульную структуру программы можно представить следующей схемой:
буфер обмен программа многопоточность
Стрелками показана очерёдность использования модулей при запуске приложения.
Модуль ClipboardEditor.cpp содержит в себе функцию WinMain(), которая вызывает функции создания приложения и формы, описания которых содержаться в заголовочном файле Unit1.h, реализация методов, описанных в этом файле, находится в Unit1.cpp. Этот модуль подробнее будет рассмотрим позже.
2.2 Модуль Unit1.cpp
В этом модуле содержится реализация всех методов формы, которую использует приложение, а также дополнительных функций. Эти самые дополнительные функции и выполняют основные действия по отображению и редактированию (на самом же деле вызова Notepad.exe или MsPaint.exe) буфера обмена. Вот заголовки и краткие спецификации этих самых дополнительных функций:
DWORD WINAPI read_text (void *p);
Читает текст из буфера и отображает его в поле вывода.
DWORD WINAPI read_link (void *p);
Читает названия файлов, скопированных в буфер, и отображает их в поле вывода.
DWORD WINAPI read_bmp (void *p);
Читает картинку из буфера и отображает её в поле вывода.
DWORD WINAPI edit_text (void *p);
Вызывается для редактирования текстовых данных. Именно в этой функции содержиться запуск программы Notepad.exe и ожидание её закрытия.
DWORD WINAPI edit_bmp (void *p);
Вызывается для редактирования изображений. Именно в этой функции содержится запуск программы MsPaint.exe и ожидание её закрытия.
В каждой из этих функций есть входной параметр, который на самом деле не используется в теле функций. Он нужен для того, чтобы каждая из функций была пригодна для запуска её в отдельном потоке.
Также стоит отметить особенности работы функций редактирования: каждая из функций сначала создаёт файл, затем открывает буфер обмена, считывает из него данные, закрывает буфер обмена, записывает данные в файл, затем открывает необходимое приложение, ждёт его завершения и потом уже из файла помещает данные в буфер обмена. Заметим, что во время ожидания завершения редактирования (на самом деле приложения), буфер обмена не принадлежит ни одному окну, что позволяет использовать его во время редактирования его же содержимого.
2.3 Многопоточность
В программе реализована многопоточность. Потоки создаются в двух случаях: чтобы отобразить содержимое буфера обмена и чтобы отредактировать это содержимое. Выполнение основных функций программы различными потоками позволяет разгрузить основной поток программы, он не находится длительное время в режиме ожидания. Этот поток, можно сказать, отвечает за прорисовку окна и кнопок программы. Также существуют ещё 2 потока, один из них создаётся при отображении содержимого буфера обмена, а другой - при редактировании. Если бы не было многопоточности, то программа во время редактирования данных находилась бы в состоянии ожидания, и не было бы возможности даже свернуть или переместить её. Также использование многопоточности в общем ускоряет работу программы.
3. Тестирование
3.1 Тестовые данные
Воспользуемся тремя видами тестовых данных.
- Текстовый, например текст Hello!
- Ярлык С++Builder в меню пуск.
- Копия экрана в какой-то момент времени.
Каждый раз, при тестировании, нужно помещать в буфер обмена данные. В первых двух случаях с помощью мыши. В третьем случае с помощью клавиши Prt Sc на клавиатуре.
Для первого и третьего тестов, которы