FreeBASIC в России

   

 Главная   Исходники   Русскоязычный форум   Полезные файлы   Пользователи   Поиск

 

 FB Wiki   Уроки   Скачать FreeBASIC   Проекты   Ссылки   Загрузить   Каталог ссылок

 
 

 Замечания и предложения по работе сайта оставляйте здесь.

Сейчас на сайте:

Вы вошли как: Guest   Регистрация   

Логин:     Пароль:     

Создай бесплатно WebMoney кошелёк на своём мобильном всего за 5 минут

 

Делаем dll своими руками

Хэндл окна

Графические средства языка

Точка пересечения отрезков

Окна без рамки

Физика поведения ядра

Win32 API Введение

►Урок 1 Win32 API

►Урок 2 Win32 API

►Урок 3 Win32 API

►Урок 4 Win32 API

►Урок 5 Win32 API

►Урок 6 Win32 API

►Урок 7 Win32 API

►Урок 8 Win32 API

►Урок 9 Win32 API

►Урок 10 Win32 API

►Урок 11 Win32 API

►Урок 12 Win32 API

►Урок 13 Win32 API

►Урок 14 Win32 API

►Урок 15 Win32 API

►Урок 16 Win32 API

►Урок 17 Win32 API

►Урок 18 Win32 API

►Урок 19 Win32 API

►Урок 20 Win32 API

►Урок 21 Win32 API

►Урок 22 Win32 API

►Урок 23 Win32 API

►Урок 24 Win32 API

Ассоциация файлов

Определить OS

Выводит имя компьютера

 

 

 

Win32 API. Урок 12. Память и файлы.

Опытом поделился и оптимизировал под FreeBASIC:   15.01.2011

 

Реклама:

Кредит кредит наличными с доставкой Хоум Кредит Банк;Детальный бухгалтерский аутсорсинг москва. Хороший форум про бухгалтерский аутсорсинг Москва.;Кухня - интерьер, дизайн, ремонт. Дизайн интерьера кухни Динамо.;Виза в Шенгенские страны - польша виза.;Объявления фирм и предприятий - вентиляция дома. Вентиляторы бытовые.

 

Мы выучим основы менеджмента памяти и файловых операций ввода/вывода в этом Уроке. Также мы используем обычные диалоговые окна как устройства ввода/вывода.

Теория:

Менеджмент памяти под Win32 с точки зрения приложения достаточно прост и прямолинеен. Используемая модель памяти называется плоской моделью памяти. В этой модели все сегментные регистры (или селекторы) указывают на один и тот же стартовый адрес и смещение 32-битное, так что приложение может обратиться к любой точке памяти своего адресного пространства без необходимости изменять значения селекторов. Это очень упрощает управление памятью. Больше нет "дальних" и "ближних" указателей.

Под Win16 существует две основные категории функций API памяти: глобальные и локальные. Функции глобального типа взаимодействуют с памятью в других сегментах, поэтому они функции "дальней" памяти. Функции локального типа взаимодействуют с локальной кучей процессов, поэтому они функции "ближней" памяти.

Под Win32 оба этих типа идентичны. Используете ли вы GlobalAlloc или LocalAlloc, вы получите одинаковый результат.

1. Выделите блок памяти с помощью вызова GlobalAlloc. Эта функция возвращает хэндл на запрошенный блок памяти.
2. "Закройте" блок памяти, вызвав GlobalLock. Эта функция принимает хэндл на блок памяти и возвращает указатель на блок памяти.
3. Вы можете использовать указатель, чтобы читать или писать в память.
4. "Откройте" блок памяти с помощью вызова GlobalUnlock. Эта функция возвращает указатель на блок памяти.
5. Освободите блок памяти с помощью GlobalFree. Эта функция принимает хэндл на блок памяти.


Вы также можете заменить "Global" на "Local", т.е. LocalAlloc, LocalLock и т.д.
Вышеуказанный метод может быть упрощен использованием флага GMEM_FIXED при вызове GlobalAlloc. Если вы используете этот флаг, возвращаемое значение от Global/LocalAlloc будет указателем на зарезервированный блок памяти, а не хэндл этого блока. Вам не надо будет вызывать Global/LocalLock вы сможете передать указатель Global/LocalFree
без предварительного вызова Global/LocalUnlock. Но в этом туториале я использую "традиционный" подход, так как вы можете столкнуться с ним при изучении исходников других программ.

Файловый ввод/вывод по Win32 имеет значительное сходство с тем, как это делалось под DOS. Все требуемые шаги точно такие же. Вам только нужно изменить прерывания на вызовы API функций.

1. Откройте или создайте файл функцией CreateFile. Эта функция очень универсальна: не считая файла, она может открывать компорты, пайпы, дисковые приводы
и консоли. В случае успеха она возвращает хэндл файла или устройства. Затем вы можете использовать этот хэндл, чтобы выполнить определенные действия над файлом или устройством.
2. Переместите файловый указатель в желаемое местоположение функцией SetFilePointer.
3. Проведите операцию чтения или записи с помощью вызова ReadFile или WriteFile. Перед этим вы должны зарезервировать достаточно большой блок памяти для данных.
4. Закройте файл с помощью CloseHandle. Эта функция принимает хэндл файла.


Содержание:

Приведенная ниже программа отображает файловое диалоговое окно. Оно позволяет пользователю использовать текстовый файл, чтобы открыть и показать
содержимое файла в клиентской области edit control'а. Пользователь может изменять текст в edit control'е по своему усмотрению, а затем может сохранить
содержимое в файл.

файл mf.bas

Скопировать данный код в буфер обмена

файл mf.bi

Скопировать данный код в буфер обмена

файл mf.rc

Скопировать данный код в буфер обмена

Анализ:

case WM_CREATE
hwndEdit = CreateWindowEx _
(NULL, _
"edit", _
NULL, _
WS_VISIBLE or WS_CHILD or ES_LEFT or ES_MULTILINE or _
ES_AUTOHSCROLL or ES_AUTOVSCROLL, _
0, _
0, _
0, _
0, _
hWnd, _
cptr(HMENU,EditID), _
hModule, _
NULL)

В секции WM_CREATE мы создаем edit control. Отметьте, что параметры, которые определяют x, y, width, height контрола равны нулю, поскольку мы изменим размер контрола позже, чтобы покрыть всю клиентскую область родительского окна.

Заметьте, что в этом случае мы не должны вызывать ShowWindow, чтобы заставить появиться контрол на экране, так как мы указали стиль WS_VISIBLE. Вы можете использовать этот трюк и для родительского окна.

;==============================================
; Инициализируем структуру
;==============================================
ofn.lStructSize = SIZEOF(OPENFILENAME)
ofn.hWndOwner = hWnd
ofn.hInstance = hModule
ofn.lpstrFilter = _
@!"Text files, *.txt\0*.txt\0Bas files, *.bas\0*.bas\0Bi files, *.bi\0*.bi\0All files, *.*\0*.*\0\0"
ofn.lpstrFile = @buffer
ofn.nMaxFile = MAXSIZE '

После создания edit control'а, мы инициализируем члены ofn. Так как мы хотим использовать ofn повторно в диалоговом окне, мы заполняем только общие члены, которые используются и GetOpenFileName и GetSaveFileName. Секция WM_CREATE - это прекрасное место для одноразовой инициализации.

case WM_SIZE
MoveWindow _
(hwndEdit, _
0,0, _
loword(lParam), _
hiword(lParam), _
TRUE)

Мы получаем сообщения WM_SIZE, когда размер клиентской области нашего основного окна изменяется. Мы также получаем его, когда окно создается. Для того, чтобы получать это сообщение, стили класса окна должны включать CS_REDRAW и CS_HREDRAW. Мы используем эту возможность для того, чтобы сделать размер нашего edit control'а равным клиентской области окна. Для начала мы должны узнать текущую ширину и высоту клиентской области родительского окна. Мы получаем эту информацию из lParam. Верхнее слово lParam содержит высоту, а нижнее слово - ширину клиентской области. Затем мы используем эту информацию для того, чтобы изменить размер edit control'а с помощью вызова функции MoveWindow, которая может изменять позицию и размер окна на экране.

case IDM_OPEN
ofn.Flags = OFN_FILEMUSTEXIST or _
OFN_PATHMUSTEXIST or OFN_LONGNAMES or _
OFN_EXPLORER or OFN_HIDEREADONLY
if GetOpenFileName(@ofn) = true then

Когда пользователь выбирает пункт меню File/Oрen, мы заполняем в структуре параметр Flags и вызываем функцию GetOрenFileName, чтобы отобразить окно открытия
файла.

hFile = CreateFile _
(@buffer, _
GENERIC_READ or GENERIC_WRITE , _
FILE_SHARE_READ or FILE_SHARE_WRITE, _
NULL, _
OPEN_EXISTING, _
FILE_ATTRIBUTE_ARCHIVE, _
NULL)

После того, как пользователь выберет файл для открытия, мы вызываем CreateFile, чтобы открыть файл. Мы указываем, что функция должна попробовать открыть файл для чтения и записи. После того, как файл открыт, функция возвращает хэндл на открытый файл, который мы сохраняем в глобальной переменной для будущего
использования. Эта функция имеет следующий синтаксис:

function CreateFile _
(byval lpFileName as LPCSTR, _
byval dwDesiredAccess as DWORD, _
byval dwShareMode as DWORD, _
byval lpSecurityAttributes as LPSECURITY_ATTRIBUTES, _
byval dwCreationDistribution as DWORD, _
byval dwFlagsAndAttributes as DWORD, _
byval hTemplateFile as HANDLE) as HANDLE


• dwDesireAccess указывает, какую операцию вы хотите выполнить над файлом.

• Открыть файл для проверки его атрибутов. Вы можете писать и читать из файла.
• GENERIC_READ Открыть файл для чтения.
• GENERIC_WRITE Открыть файл для записи.

• dwShareMode указывает, какие операции вы хотите позволить выполнять вашим процессам над открытыми файлами.

• 0 Не разделять файл с другими процессами.
• FILE_SHARE_READ позволяет другим процессам прочитать информацию из файла, который был открыт
• FILE_SHARE_WRITE позволяет другим процессам записывать информацию в открытый файл.

• lpSecurityAttributes не имеет значения под Windows 95.
• dwCreationDistribution указывает действие, которое будет выполнено над файлом при его открытии.

• CREATE_NEW Создание нового файла, если файла не существует.
• CREATE_ALWAYS Создание нового файла. Функция перезаписывает файл, если он существует.
• OPEN_EXISTING Окрытие существующего файла.
• OPEN_ALWAYS Открытие файла, если он существует, в противном случае, функция создает новый файл.
• TRUNCATE_EXISTING Открытие файла и обрезание его до нуля байтов. Вызывающий функцию процесс должен открывать файл, по крайней мере, с доступом GENERIC_WRITE.
Если файл не существует, функция не срабатывает.

• dwFlagsAndAttributes указывает атрибуты файла

• FILE_ATTRIBUTE_ARCHIVE Файл является архивным файлом. Приложения используют этот атрибут для бэкапа или удаления.
• FILE_ATTRIBUTE_COMPRESSED Файл или директория сжаты. Для файла это означает, что вся информация в файле заархивирована. Для директории это означает, что
сжатие подразумевается по умолчанию для создаваемых вновь файлов и поддиректорий.
• FILE_ATTRIBUTE_NORMAL У файла нет других атрибутов. Этот атрибут действителен, только если исопльзуется один.
• FILE_ATTRIBUTE_HIDDEN Файл спрятан. Он не включается в обычные листинги директорий.
• FILE_ATTRIBUTE_READONLY Файл только для чтения. Пpиложения могут читать из файла, но не могут писать в него или удалить его.
• FILE_ATTRIBUTE_SYSTEM Файл - часть операционной системы или используется только ей.


hMemory = GlobalAlloc _
(GMEM_MOVEABLE or _
GMEM_ZEROINIT, _
MEMSIZE)
pMemory = GlobalLock(hMemory)

Когда файл открыт, мы резервируем блок памяти для использования функциями ReadFile и WriteFile. Мы указываем флаг GMEM_MOVEABLE, чтобы позволить Windows перемещать блок памяти, чтобы уплотнять последнюю.

Когда GlobalAlloc возвращает в хэндл положительный результат, Мы передаем хэндл функции GlobalLock, которая возвращает указатель на блок памяти.

ReadFile _
(hFile, _
pMemory, _
MEMSIZE-1, _
@SizeReadWrite, _
NULL)
SendMessage _
hwndEdit, _
WM_SETTEXT, _
NULL, _
cPtr(LPARAM, pMemory)

Когда блок памяти готов к использованию, мы вызываем функцию ReadFile для чтения данных из файла. Когда файл только что открыт или создан, указатель на смещение равен нулю. В этом случае, мы начинаем чтение с первого байта. Первый параметр ReadFile - это хэндл файла, из которого необходимо произвести чтение, второй - это указатель на блок памяти, затем - количество байтов, которое нужно считать из файла, четвертый параметр - это адрес переменной размера uInteger,
которая будет заполнена количеством байтов, в реальности считанных из файла.

После заполнения блока памяти данными, мы помещаем данные в edit control, посылая сообщение WM_SETTEXT контролу, причем lParam содержит указатель на блок памяти. После этого вызова edit control отображает данные в его клиентской области.

CloseHandle(hFile)
GlobalUnlock(pMemory)
GlobalFree(hMemory)
end if

В этом месте у нас нет необходимости держать файл открытым, так как нашей целью является запись модифицированных данных из edit control'а в другой файл, а не в оригинальный. Поэтому мы закрываем файл функцией CloseHandle, передав ей в качестве параметра хэндл файла. Затем мы открываем блок памяти и освобождаем его. В действительности, вам не нужно освобождать его сейчас, вы можете использовать этот же блок во время операции сохранения. Но в демонстрационных целях
я освобождаю его сейчас.

SetFocus(hwndEdit)

Когда на экране отображается окно открытия файла, фокус ввода сдвигается на него. Поэтому, когда это окно закрывается, мы должны передвинуть фокус ввода обратно на edit control.

Это заканчивает операцию чтения из файла. В этом месте пользователь должен отредактировать содержимое edit control'а. И когда он хочет сохранить данные в другой файл, он должен выбрать File/Save, после чего отобразиться диалоговое окно. Создание окна сохранения файла не слишком отличается от создание
окна открытия файла. Фактически, они отличаются только именем функций. Вы можете снова использовать большинство из параметров структуры ofn, кроме параметра
Flags.

ofn.Flags = OFN_LONGNAMES or _
OFN_EXPLORER or OFN_HIDEREADONLY

В нашем случае, мы хотим создать новый файл, так чтобы OFN_FILEMUSTEXIST и OFN_PATHMUSTEXIST должны быть убраны, иначе диалоговое окно не позволит нам создать файл, который еще не существует.

Параметр dwCreationDistribution функции CreateFile должен быть установлен в CREATE_NEW, так как мы хотим создать новый файл.
Оставшийся код практически одинаков с тем, что используется при создании окна открытия файла, за исключением следующего:

size = SendMessage _
(hwndEdit, _
WM_GETTEXT, _
MEMSIZE-1, _
cPtr(LPARAM, pMemory))
WriteFile _
(hFile, _
pMemory, _
MEMSIZE-1, _
@SizeReadWrite, _
NULL)

Мы посылаем сообщение WM_GETTEXT edit control'у, чтобы скопировать данные из него в блок памяти, возвращаемое значение - это длина данных внутри буфера.
После того, как данные оказываются в блоке памяти, мы записываем их в новый файл.

[C] Iczelion, пер. Aquila.

 

 

Прокомментировать

Ваше имя:  

Ваш e-mail:  

Сообщение:



Введите код: 

 

 

   Спасибо можно сказать, посетив любую ссылку:

 

 

© 2010-2012

DEPOzit (Попов Денис Владимирович)

WebMoney кошелёк: WMID#302963000004

ICQ:279786014 или R549103331586   Z116647355686