платформа Win32 - Туториалы Iczelion'a на русском, адаптированные для FreeBasic. Урок 12 - Память и файлы

Предыдущая тема Следующая тема Перейти вниз

платформа Win32 - Туториалы Iczelion'a на русском, адаптированные для FreeBasic. Урок 12 - Память и файлы

Сообщение  electrik в Пн Июн 29, 2009 6:12 pm

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

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

Теория:

Менеджмент памяти под 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

Код:

' память и файлы
#define WIN_INCLUDEALL
#include "windows.bi"
#include "mf.bi"
declare function WinMain ( byval hInst as HINSTANCE, _
byval hPrevInst as HINSTANCE, _
  byval szCmdLine as LPSTR, _
  byval iCmdShow as integer ) as integer

' начало программы
dim shared hModule as HINSTANCE ' хэндл модуля
dim shared hMemory as HGLOBAL ' хэндл выделенного блока памяти
dim shared pMemory  as LPVOID ' указатель на выделенный блок памяти
dim shared hwndEdit as HWND ' хэндл editboxа
dim shared hFile as HANDLE ' хэндл файла
dim shared SizeReadWrite as uInteger ' число действительно прочитанных/записанных байт
dim shared size as uInteger' длина данных в нутри буфера
dim shared ofn as OPENFILENAME ' структура OPENFILENAME
dim shared as zstring * MAXSIZE buffer ' буфер для имени файла
hModule =  GetModuleHandle( NULL )
end WinMain(hModule,NULL,GetCommandLine() , SW_SHOWNORMAL ) ' вызвать основную функцию
' здесь заканчивается программа

' процедура окна
function  WndProc _
(byval hwnd as HWND, _ ' хэндл окна
byval uMsg as UINT, _ ' сообщение
byval wParam as WPARAM, _ ' дополнительный  параметр сообщений
byval lParam as LPARAM) as LRESULT ' дополнительный параметр сообщений

function = 0
select case uMsg  'начинаем обработку сообщений
case WM_DESTROY ' если пользователь закрывает окно
PostQuitMessage(0) ' выходим из программы
exit function
case WM_CREATE ' если получили сообщение WM_CREATE

' создадим editBox
hwndEdit = CreateWindowEx _
(NULL, _ ' дополнительные стили
"edit", _ ' класс окна
NULL, _ 'заголовок окна
WS_VISIBLE  or WS_CHILD or ES_LEFT or ES_MULTILINE or _
ES_AUTOHSCROLL or ES_AUTOVSCROLL, _ ' стили окна
0, _ ' X
0, _ ' Y
0, _ ' ширина окна
0, _ ' высота окна
hWnd, _ ' хэндл родительского окна
cptr(HMENU,EditID), _ ' идентификатор
hModule, _ ' хэндл модуля
NULL)  ' указатель на структуру данных
 SetFocus(hwndEdit) ' установим фокус на editbox

' заполняем структуру OPENFILENAME
ofn.lStructSize = SIZEOF(OPENFILENAME) ' размер структуры 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 ' размер буфера
case WM_SIZE ' если сообщение WM_SIZE
    MoveWindow _ ' изменим размер editboxа
    (hwndEdit, _ ' хэндл editboxа
    0,0, _
    loword(lParam), _ ' ширина
    hiword(lParam), _ ' высота
    TRUE)

case WM_COMMAND ' если получили сообщение WM_COMMAND
if lParam = 0 then ' если lParam = 0, значит идет сообщение от меню
select case loword(wParam)  ' начинаем обрабатывать элементы меню
case IDM_OPEN ' если в меню выбрали open

' заполним некоторые флаги в структуре OPENFILENAME
ofn.Flags = OFN_FILEMUSTEXIST or _
OFN_PATHMUSTEXIST or OFN_LONGNAMES or _
OFN_EXPLORER or OFN_HIDEREADONLY
if GetOpenFileName(@ofn) = true then ' если в диалоге открытия файла выбрали файл
hFile = CreateFile _ ' создадим файл
(@buffer, _ ' указатель на буфер содержащий имя файла
GENERIC_READ or GENERIC_WRITE , _ ' открыть для чтения и записи
    FILE_SHARE_READ or FILE_SHARE_WRITE, _ ' разрешить другим процессам чтение/запись этого файла
NULL, _ ' атрибуты безопасности
OPEN_EXISTING, _ ' открыть существующий
FILE_ATTRIBUTE_ARCHIVE, _ ' атрибуты файла. установить атрибут архивный
NULL)
hMemory = GlobalAlloc _ ' выделим блок памяти
(GMEM_MOVEABLE or _ ' позволить windows перемещать блок
GMEM_ZEROINIT, _ ' инициализировать нулями
MEMSIZE) ' размер блока в байтах
pMemory = GlobalLock(hMemory) ' получим указатель на выделенный блок
ReadFile _ ' читаем файл
(hFile, _ ' хэндл файла
pMemory, _ ' указатель на блок памяти
MEMSIZE-1, _ ' прочитать количество байт
@SizeReadWrite, _ ' указатель на переменную, число действительно прочитанных байт
NULL)
SendMessage _ ' пошлем сообщение
hwndEdit, _ ' хэндл editboxа
WM_SETTEXT, _сообщение
NULL, _
cPtr(LPARAM, pMemory) ' указатель на блок памяти
CloseHandle(hFile) 'закроем файл
GlobalUnlock(pMemory) '
GlobalFree(hMemory) ' освободим блок
end if
SetFocus(hwndEdit) ' установим фокус в editbox
case IDM_SAVE ' если в меню выбрали save
' заполним некоторые элементы структуры OPENFILENAME
ofn.Flags = OFN_LONGNAMES or _
OFN_EXPLORER or OFN_HIDEREADONLY
if GetSaveFileName(@ofn) = TRUE then ' если в диалоге сохранения файла выбрали файл
hFile = CreateFile _ ' создадим файл
(@buffer, _ ' указатель на буфер содержащий имя файла
GENERIC_READ or GENERIC_WRITE , _ ' открыть для чтения и записи
    FILE_SHARE_READ or FILE_SHARE_WRITE, _ ' разрешить другим процессам чтение/запись этого файла
NULL, _ ' атрибуты безопасности
CREATE_NEW, _ ' создать новый
FILE_ATTRIBUTE_ARCHIVE, _ ' атрибуты файла. установить атрибут архивный
NULL)
hMemory = GlobalAlloc _ ' выделим блок памяти
(GMEM_MOVEABLE or _ ' позволить windows перемещать блок
GMEM_ZEROINIT, _ ' инициализировать нулями
MEMSIZE) ' размер блока в байтах
pMemory = GlobalLock(hMemory) ' получим указатель на выделенный блок
size =     SendMessage _ ' пошлем сообщение
    (hwndEdit, _ ' хэндл editboxа
    WM_GETTEXT, _ ' сообщение
    MEMSIZE-1, _ ' размер читаемыйх данных
    cPtr(LPARAM, pMemory)) ' указатель на выделенный блок
WriteFile _ ' запишем в файл
(hFile, _ ' хэндл файла
pMemory, _ ' указатель на выделенный блок
size, _ ' число сохраняемых байт
@SizeReadWrite, _ ' указатель на переменную, число действительно сохраненных байт
NULL)
CloseHandle(hFile) ' закроем файл
    GlobalUnlock(pMemory) '
GlobalFree(hMemory) ' освободим блок
end if
SetFocus(hwndEdit) ' установим фокус в editbox
    case IDM_EXIT
        DestroyWindow(hWnd) ' разрушим окно и выдем из программы
        end select
    end if
end select
function = DefWindowProc(hWnd,uMsg,wParam,lParam) ' Дефаултная функция обработки окна
end function


'функция WinMain
function WinMain _
(byval hInst as HINSTANCE, _ ' хэндл программы
byval hPrevInst as HINSTANCE, _ 'в win32 всегда 0
byval szCmdLine as LPSTR, _  'указатель на командную строку
byval iCmdShow as integer ) as integer  ' состояние окна при первом появлении

dim wc as WNDCLASSEX ' структура параметров окна
dim wMsg as MSG  ' структура сообщений
dim hWnd as HWND ' хэндл окна

 
 ' заполняем структуру wc
wc.cbSize = SIZEOF( WNDCLASSEX )  ' размер структуры WNDCLASSEX
wc.style = CS_HREDRAW or CS_VREDRAW  ' Стиль окна
wc.lpfnWndProc = @WndProc ' Адрес процедуры окна WndProc
wc.cbClsExtra = NULL  ' резервирование  дополнительных байт за концом структуры
wc.cbWndExtra = NULL
wc.hInstance = hInst  ' хэндл модуля
wc.hbrBackground = cast(HGDIOBJ, COLOR_WINDOW+1) ' Цвет фона
wc.lpszMenuName = @"FirstMenu" ' хэндл меню
wc.lpszClassName = @ClassName ' имя класса окна
wc.hIcon = LoadIcon( NULL,IDI_APPLICATION ) ' Хэндл иконки
wc.hIconSm = wc.hIcon 'Хэндл маленькой иконки
wc.hCursor = LoadCursor( NULL,IDC_ARROW) ' Хэндл курсора


' регистрация нашего класса окна
if(RegisterClassEx(@wc) = FALSE) then
MessageBox(0,"Не могу зарегистрировать класс окна","Ошибка",0)
end 1
end if

' Создадим окно
hwnd = CreateWindowEx _
(WS_EX_CLIENTEDGE, _ ' дополнительные стили
ClassName, _ ' строка с именем класса окна
AppName, _ ' строка с именем окна
WS_OVERLAPPEDWINDOW, _ ' стиль окна
CW_USEDEFAULT, _ ' X
CW_USEDEFAULT, _ ' Y
300, _ ' ширина окна
200, _ ' высота окна
NULL, _ ' хэндл родительского окна
NULL, _ ' хэндл меню
hInst, _ ' хэндл модуля
NULL) ' указатель на структуру данных

ShowWindow( hwnd,iCmdShow) ' отобразить наше окно на десктопе
UpdateWindow( hwnd) ' обновить клиентскую область

while( GetMessage( @wMsg, NULL, 0, 0 ) <> FALSE )  'цикл сообщений
TranslateMessage( @wMsg )
DispatchMessage( @wMsg )
wend
function = wMsg.wParam
end function

файл mf.bi

Код:

#define ClassName "Win32FreeBasicEditClass"
#define AppName "Win32 FreeBasic Edit"
#define IDM_OPEN 32000
#define IDM_SAVE 32001
#define IDM_EXIT 32002
#define MAXSIZE 260
#define MEMSIZE 65535 ' размер памяти в байтах
#define EditID 1 ' идентификатор editboxа

файл mf.rc

Код:

#include "mf.bi"
FirstMenu MENU
{
POPUP "&File"
{
MENUITEM "&Open",IDM_OPEN
MENUITEM "&Save",IDM_SAVE
MENUITEM SEPARATOR
MENUITEM "E&xit",IDM_EXIT
}
}


Последний раз редактировалось: electrik (Вт Май 23, 2017 5:47 pm), всего редактировалось 1 раз(а)

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: платформа Win32 - Туториалы Iczelion'a на русском, адаптированные для FreeBasic. Урок 12 - Память и файлы

Сообщение  electrik в Пн Июн 29, 2009 6:14 pm

Win32 API. Урок 12. Память и файлы - продолжение

Анализ:

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.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 36
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу


 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения