Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

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




BOOL GetFileTime(HANDLE hFile,

LPFILETIME lpCreationTime,

LPFILETIME lpLastAccessTime,

LPFILETIME lpLastWriteTime);

Перед вызовом данной функции, необходимо открыть файл, о значениях времени которого необходимо получить информацию. Функции GetFileTime передается дескриптор этого файла и указатели на три экземпляра структуры FILETIME, в которые будут записаны время создания (lpCreationTime), время последнего доступа (lpLastAccessTime) и время последней записи (lpLastWriteTime).

 

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

BOOL SetFileTime(HANDLE hFile,

const FILETIME *lpCreationTime,

const FILETIME *lpLastAccessTime,

const FILETIME *lpLastWriteTime):

В качестве входных параметров функция SetFileTime принимает указатели на три экземпляра структуры FILETIME и дескриптор файла. Экземпляры структур уже заполнены необходимыми значениями времени. В случае успешного завершения функция возвращает ненулевое значение в регистре ЕАХ.

 

3) В Win32 имеется функция GetFileInformationByHandle, с помощью которой можно получить все атрибуты файла:

BOOL GetFileInformationByHandle (HANDLE hFile,

LPBY_HANDLE_FILE_INFORMATION lpFileInformation);

На вход данной функции передается дескриптор файла, о котором необходимо получить информацию, и указатель на экземпляр структуры BY_HANDLE_FILE_INFORMATION, который заполняется этой функцией. В этой структуре сосредоточена вся информация о файле.


Пример 10: Разработать Win32 - консольное приложение с использованием функции GetFileInformationByHandle.

 

;---------------------------описание структур----------------------------

FILETIME struc

DwLowDateTime dd?;младшие 32 бита значения времени

DwHighDateTime dd?;старшие 32 бита значения времени

FILETIME ends

 

BY_HANDLE_FILE_INFORMATION struc

DwFileAttributes dd 0;атрибуты файла

 

struc

ftCreationTime_DwLowDateTime dd?; младшие 32 бита времени

; создания файла

ftCreationTimeDwHighDateTime dd?;старшие 32 бита времени создания

; файла

Ends

 

Struc

FtLastAccessTime_DwLowDateTime dd?; младшие 32 бита времени

; последнего доступа

FtLastAccessTime_DwHighDateTime dd?; старшие 32 бита времени

; последнего доступа

еnds

 

struc

ftLastWriteTime_DwLowDateTime dd?; младшие 32 бита времени

; последней записи

ftLastWnteTime_DwHighDateTime dd?;старшие 32 бита времени

; последней записи

ends

 

dwVolumeSerialNumber dd 0;серийный номер тома, на котором

; находится файл

nFileSizeHigh dd 0; старшие 32 бита размера файла

nFileSizeLow dd 0; младшие 32 бита размера файла

nNumberOfLinks dd 0; число ссылок на файл

nFileIndexHigh dd 0;старшие 32 бита идентификатора файла

nFileIndexLow dd 0; младшие 32 бита идентификатора файла

ends

 

.data

info BY_HANDLE_FILE_INFORMATION <>

TitleText db 'Получение информации о файле в Win32',0

lpBuf db "File1.txt",0

hFile dd 0

.code

;-------------------------------------Открываем файл--------------------

push 0

push 0

push OPEN_EXISTING; открыть существующий файл, если его нет –

; ошибка

push 0; защита файла не требуется

push FILE_SHARE_READ;разрешено совместное использование файла

; (по чтению)

push GENERIC_READ; разрешено чтение из файла

push offset lpBuf

call CreateFileA

сmp eax,0ffffffffh

je exit; если неуспех

mov hFile,eax; дескриптор файла

;---------------------------GetFileInformationByHandle

push offset info

push hFile

call GetFileInformationByHandle

cmp eax,0

jz exit; выход в случае неудачи

; результат смотрим в отладчике TD32.exe

 

 

Самостоятельно на практике: Вывести все атрибуты созданного текстового файла File1.txt на консоль.

 


Лекция №11. Работа с графикой на ассемблере

"У меня есть пример, который должен работать с текстовым экраном. Но он не работает под Windows XP. Как это исправить?"

 

Ответ:

Действительно, может показаться, что ни одна программа для DOS, использующая прямой вывод в видеопамять (по адресам 0B800h:0000h) не работает под Windows XP (хотя нормально работает под Windows 98), т.к. на экране ничего не появляется. Но на самом деле это не так.

Все консольные приложения Windows работают в текстовом режиме, но это не одно и то же, что и текстовый режим, в котором работала DOS. Консоль в Windows не имеет прямой связи с видеопамятью, т.к. обычно Windows работает в графическом режиме, в то время как консоль представляет собой текстовое устройство, да и размеры консоли вовсе не ограничиваются текстовыми режимами, которые поддерживает видеокарта. Вы можете задать произвольные размеры консоли (в символах) в свойствах ярлыка программы (закладка "Расположение").

При этом, когда в окне консоли запускается DOS задача, эмуляция видеопамяти по адресам 0B800h:0000h не настроена. И изменение оперативной памяти в этом блоке не приводит к изменению состояния буфера консоли. Не поможет в этом случае и переход в полноэкранный режим.

Но решение этой проблемы существует, и оно достаточно простое. Если Ваша программа намеревается работать напрямую с видеопамятью, просто добавьте в ее начало следующие строчки кода:

mov ax, 3 int 10h

Эта функция установит обычный текстовый режим 80х25 для программы и одновременно... настроит эмуляцию участка памяти 0B800h:0000h в буфер консоли. Программа при этом будет работать правильно (как в оригинальной DOS) как в оконном, так и в полноэкранном режиме. И при это не стоит слушать людей, которые утверждают, что ХР не разрешает работать напрямую с буфером видеопамяти по адресам 0B800h:0000h!

 

Современные видеоконтроллеры поддерживают разнообразные текстовые и графические режимы. Текстовые режимы различаются по разрешению (число отображаемых символов по горизонтали и вертикали) и цветовой палитре (монохромный или 16-цветный режим). Для графических режимов основным признаком классификации является количество одновременно отображаемых цветов и, соответственно, количество бит видеопамяти, отводимое на каждую точку (пиксел) изображения. Различают следующие типы графических режимов:

– монохромный (1-битное кодирование);

– 16-цветный EGA/VGA (4-битное кодирование);

– 256-цветный SVGA (8-битное кодирование);

HiColor (16-битное кодирование);

TrueColor (24-битное / 32-битное кодирование).

Графические режимы VGA (SVGA) сильно устарели, а текстовые продолжают успешно применяться.

 

 

Для работы с графическим адаптером, в BIOS используется прерывание INT 10h. Оно позволяет устанавливать графические режимы работы, выводить символы и графику. Выбор графического режима Функция 0 (ah=0) прерывания INT 10h устанавливает видео режим, который был указан в регистре AL.

В этой таблице приведены значения для графических режимов.

Графические режимы

Режим Разрешение Количество цветов
06h 640x200  
0Dh 320x200  
0Eh 640x200  
0Fh 640x350  
10h 640x350  
11h 640x480  
12h 640x480  
13h 320x200  
6Ah * 800x600  

Режим 6Ah утвержден VESA, но его поддерживают не все видео адаптеры

Существуют также дополнительные режимы, которые используются для SVGA и XGA адаптеров. Они устанавливаются вызовом VESA BIOS Extension (AX=4F02h INT 10h).

Рисование точки

Для рисования точки необходимо вызвать функцию 0Ch прерывания INT 10h. Цвет помещается в AL, видеостраница в BH, координатаY в DX, а координатаX в CX. Следующая процедура рисует точку с цветом 1, в X=50 и Y=20.

mov ah,0Ch; функция рисования точки mov al,1; цвет точки mov bh,0; видео страница mov cx,50; координата X mov dx,20; координата Y int 10h; вызов прерывания BIOS

Функция 0Ch исполняется очень медленно, особенно при рисовании множества точек. Настоящие графические программы (такие как игры) записывают непосредственно в видеопамять, после того, как они рассчитали цвет и расположение точки. Но в нашем случае INT 10h является промежуточным шагом на пути к настоящему программированию графики (прямой вывод графики в видео режиме 13h (320x200x256)).

Пример программы

Эта программа переключается в графический режим, рисует длинную линию, используя функцию 0Сh, затем ожидает нажатия клавиши и возвращается в прежний режим.

.model small.stack 100h.386Mode_6 = 6; 640 X 200, 2 colors Mode_13 = 0Dh; 320 X 200, 16 colors Mode_14 = 0Eh; 640 X 200, 16 colors Mode_15 = 0Fh; 640 X 350, 2 colors Mode_16 = 10h; 640 X 350, 16 colors Mode_17 = 11h; 640 X 480, 2 colors Mode_18 = 12h; 640 X 480, 16 colors Mode_19 = 13h; 320 X 200, 256 colors Mode_6A = 6Ah; 800 X 600, 16 colors. datasaveMode db; Сохранить текущий видео режим currentX dw 100; координата X currentY dw 100; координата Y color db 1; номер цвета; В 2 цветном режиме 1 = белый, в 16 цветном 1 = синий. code main proc mov ax,@data mov ds,ax; Получить текущий видео режим mov ah,0Fh int 10h mov saveMode,al; Переключиться в графический режим mov ah,0; установка видео режима mov al,Mode_17; номер режима int 10h; Рисование прямой линии LineLength = 100 mov dx,currentY mov cx,LineLength; счетчик цикла L1: push cx mov ah,0Ch; рисование точки mov al,color; цвет точки mov bh,0; видео страница mov cx,currentX int 10h inc currentX ;inc color; используйте для разноцветной линии pop cx loop L1; Ожидаем нажатия клавиши mov ah,0 int 16h; Возврат в прежний видео режим mov ah,0; установить видео режим mov al,saveMode; сохраненный видео режим int 10h; Выход из программы mov ax,4c00h int 21h main endp end main

 

Обзор прерываний BIOS

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...