- •1. Поняття ос, її призначення та функції.
- •1. Понятие операционной системы. Назначение, состав и функции операционных систем.
- •2. Історія розвитку ос. Класифікація сучасних ос.
- •3. Основные принципы построения ос.
- •4. Операционные оболочки.
- •5. Драйверы и утилиты.
- •6. Процессы. Определение процесса. Классификация процессов ос.
- •7. Ресурсы. Определение ресурса. Классификация ресурсов ос.
- •3. Функціональні компоненти ос.
- •4. Функциональные компоненты ос. Общая характеристика
- •5. Требования к современным ос
- •4. Ядро ос. Привілейований режим і режим користувача. Системний виклик.
- •Рхитектура ос
- •Ядро и вспомогательные модули ос
- •Ядро в привилегированном режиме
- •Микроядерная архитектура
- •Тенденции в структурном построении ос
- •Монолитные системы
- •Многоуровневые системы
- •6. Ос та її оточення. Взаємодія ос і апаратного забезпечення. Засоби апаратної підтримки ос
- •Взаимодействие с аппаратным обеспечением
- •По сфере применения[править | править вики-текст]
- •Содержание
- •Описание и использование интерфейсов[править | править вики-текст]
- •Интерфейсы и абстрактные классы[править | править вики-текст]
- •Множественное наследование и реализация интерфейсов[править | править вики-текст]
- •8. Особливості архітектури Windows. Компоненти режиму ядра. Компоненти режиму користувача. Архитектура Windows nt
- •Режим пользователя[править | править вики-текст]
- •Режим ядра[править | править вики-текст]
- •9. Процеси і потоки в сучасних ос. Складові елементи процесів і потоків. Багатопотоковість. Стани процесів і потоків. Поток выполнения
- •Отличие от процессов[править | править вики-текст]
- •Многопоточность[править | править вики-текст]
- •10. Інтерфейс Windows api. Версії Windows api. Категорії функцій Windows api.
- •Содержание
- •Общие сведения[править | править вики-текст]
- •Содержание
- •Api как средство интеграции приложений[править | править вики-текст]
- •Сигнатура функции[править | править вики-текст]
- •Семантика функции[править | править вики-текст]
- •Api операционных систем. Проблемы, связанные с многообразием api[править | править вики-текст]
- •Структура security_attributes
- •Возвращаемые значения
- •Замечания
- •Содержание
- •Общие сведения[править | править вики-текст]
- •Секреты многопоточности: изучаем модульное тестирование в сфере мобильного программинга
- •Объект ядра Событие
- •Объект ядра Мьютекс
- •Пример работы Mutex
- •Объект ядра Семафор (semaphore)
- •Критические секции
- •Атомарные операции
- •Заключение
- •15. Потоки. Функція CreateThread. Завершення потоку. Зміна класу пріоритету процесу. Установка відносного пріоритету потоку.
- •17. Робота з файлами, каталогами і дисками в Win32. Отримання інформації про диски, вільний простір.
- •18. Функція CreateFile та її параметри. Функция CreateFile
- •Коммуникационные ресурсы
- •19. Функції Windows api для пошуку файлів. Применение функций Windows api
- •Функции LoadKeyboardLayout и UnloadKeyboardLayout
- •Функция GetLocalTime
- •Функция GetTickCount
- •Функция GlobalMemoryStatus
- •Функция Sleep
- •Функции для работы с guid
- •Функция ShellExecute
- •Функция shFileOperation
- •20. Функції Windows api для читання даних з файлу та запису в файл. Синхронні і асинхронні операції з файлами. Функции api для работы с консолью
- •Использование русского языка в консоли с помощью api
- •Чтение/запись данных в консоль/файл
- •Установка заголовка окна консоли
- •Установка цвета символов и фона в консоли
- •Установка позиции курсора
Функция shFileOperation
Функция SHFileOperation из библиотеки Shell32.dll выполняет копирование, перемещение, переименование и удаление объектов файловой системы (папок и файлов). В процессе выполнения выводится стандартное окно Windows для отображения процесса, подобное показанному на рисунке:
Вот её прототип:
int SHFileOperation(
LPSHFILEOPSTRUCT lpFileOp
);
Тип данных LPSHFILEOPSTRUCT - это указатель на структуру SHFILEOPSTRUCT:
typedef struct _SHFILEOPSTRUCT{
HWND hwnd;
UINT wFunc;
LPCSTR pFrom;
LPCSTR pTo;
FILEOP_FLAGS fFlags;
BOOL fAnyOperationsAborted;
LPVOID hNameMappings;
LPCSTR lpszProgressTitle;
} SHFILEOPSTRUCT, FAR *LPSHFILEOPSTRUCT;
Описание полей структуры SHFILEOPSTRUCT:
Поле |
Описание |
||||||||||
hwnd |
Дескриптор родительского окна. Это может быть hWnd вашей формы или главного окна Visual FoxPro. |
||||||||||
wFunc |
|
||||||||||
pFrom |
Адрес строки, в которой перечислены один или большее количество наименований исходных файлов (возможно, с указанием путей). Если используется более одного наименования файла, то каждая последующая спецификация отделяется от предыдущей нулевым байтом. Строка должна завершаться двумя нулевыми байтами. |
||||||||||
pTo |
Адрес строки, в которой указана конечная папка для перемещения (копирования) файлов.Строка должна завершаться двумя нулевыми байтами. |
||||||||||
fFlags |
16-ти разрядное целое. Конкатенация флагов, определяющих порядок выполнения операции. |
||||||||||
fAnyOperationsAborted |
В поле записывается ноль, если пользователь прервал операцию, и отличное от нуля значение, если операция завершена успешно. |
||||||||||
hNameMappings |
В приложениях на Visual FoxPro не используется. Должен быть равен нулю. |
||||||||||
lpszProgressTitle |
В приложениях на Visual FoxPro не используется. Должен быть равен нулю. |
||||||||||
Параметр fFlags определяется как конкатенация (сложение) значений, перечисленных ниже:
fFlags = 512 Если папка, в которую необходимо копировать файлы, не существует, выводится диалоговое окно с запросом о создание папки:
fFlags = 256 Отображает шкалу прогресса, но не показывает имена файлов
fFlags = 128 Операция выполняется только над файлами указанной папки, если для имени и типа файла указан шаблон (*.*). Над вложенными папками никаких действий не выполняется.
fFlags = 8 Если при копировании, перемещении или переименовании файл с указанным именем уже существует в папке-адресате, то он будет заменён без предупреждающего сообщения. Иначе - выводится диалог для подтверждения замены:
fFlags = 4 Операция выполняется, окно отображения процесса не выводится.
Объявление функции SHFileOperation в Visual FoxPro:
DECLARE Long SHFileOperation IN Shell32.dll String @ FileOperation
Функция возвращает ноль при успешном выполнении.
Структура FileOperation может быть сформирована в символьной переменной длиной 26 байт; если вы хотите отслеживать ситуацию, когда пользователь отказался от файловой операции в процессе её выполнения, то передавайте эту переменную по ссылке, так как вам в этом случае потребуется проанализировать значение поля fAnyOperationsAborted.
В следующем примере показан код функции FileOperation, которая выполняет файловые операции, используя возможности, предоставляемые функцией SHFileOperation. Функция возвращает .T. при успешном выполнении операции.
FUNCTION FileOperation
LPARAMETER tcFrom, tcTo, tnOper
*
* tcFrom - спецификация исходных файлов
* tcTo - спецификация результирующих файлов (папки)
* tnOper - определяет тип операции.
* tnOper=1 - переместить файлы
* tnOper=2 - копировать файлы
* tnOper=3 - удалить файлы
* tnOper=4 - переименовать файл
*
LOCAL lcSHFO, lcFrom, lnLenFrom, lcTo, lnLenTo, hGlobalFrom, hGlobalTo
LOCAL lnFlag, lnReturn
DECLARE Long SHFileOperation IN Shell32.dll String @
DECLARE Long GlobalAlloc IN WIN32API Long, Long
DECLARE Long GlobalFree IN WIN32API Long
* Начинаем формировать структуру в переменной lcSHFO
lcSHFO = BINTOC(thisform.HWnd, '4RS') && Поле hwnd
lcSHFO = lcSHFO + BINTOC(tnOper, '4RS') && Поле wFunc - вид операции
* Обработка спецификации исходных файлов
tcFrom = tcFrom + CHR(0) + CHR(0) && Дописываем нули
lnLenFrom = LEN(tcFrom) && Длина исходной строки
hGlobalFrom = GlobalAlloc(0x0040, lnLenFrom) && Выделяем для неё блок памяти
SYS(2600, hGlobalFrom, lnLenFrom, tcFrom) && и копируем туда строку
lcSHFO = lcSHFO + BINTOC(hGlobalFrom, '4RS') && Поле pFrom
* Обработка спецификайии результирующих файлов
IF tnOper = 3
lcSHFO = lcSHFO + BINTOC(0, '4RS') && для операции удаления
ELSE
tcTo = tcTo + CHR(0) + CHR(0) && Дописываем нули
lnLenTo = LEN(tcTo) && Длина результирующей строки
hGlobalTo = GlobalAlloc(0x0040, lnLenTo) && Выделяем для неё блок памяти
SYS(2600, hGlobalFrom, lnLenFrom, tcFrom) && и копируем туда строку
lcSHFO = lcSHFO + BINTOC(hGlobalTo, '4RS') && Поле pTo
ENDIF
lnFlag = 8 + 256
lcSHFO = lcSHFO + BINTOC(lnFlag, '2RS') && Поле fFlags
lcSHFO = lcSHFO + REPLICATE(CHR(0), 12) && Последние 3 поля структуры
* Выполняем операцию
lnReturn = SHFileOperation(@lcSHFO)
* Чистим память
GlobalFree(hGlobalFrom)
IF tnOper != 3
GlobalFree(hGlobalTo)
ENDIF
* Если lnReturn = 0, то операция завершена успешно
IF lnReturn != 0
RETURN .f.
ENDIF
RETURN .t.
ENDFUNC
Проанализируем код.
Структура SHFILEOPSTRUCT для функции SHFileOperation формируется в переменной lcSHFO. Записываем в первые четыре байта переменной значение hwnd, в следующие 4 байта - значение wFunc, определяющее характер операции. Поля pFrom и pTo содержат указатели на строки, содержащие информацию о спецификациях исходных и конечных файлов. Каждая такая строка должна заканчиваться двумя нулевыми байтами. Такой вид окончания строки используется потому, что при задании спецификации, например, исходных файлов, могут быть заданы файлы, расположенные в различных папках. В этом случае спецификации этих файлов разделяются одиночным нулевым байтом. Например:
cFiles = 'c:\Foder1\File1.typ' + CHR(0) + 'd:\Folder2\File2.typ' + CHR(0) + CHR(0)
Выделяем блок в глобальной памяти Windows и получаем указатель на него:
hGlobalFrom = GlobalAlloc(0x0040, lnLenFrom)
Переписываем в выделенный блок памяти значение строки спецификации файла:
SYS(2600, hGlobalFrom, lnLenFrom, tcFrom)
Помещаем полученный указатель в поле структуры. Для преобразования целочисленного значения указателя в строку используем функцию BINTOC:
lcSHFO = lcSHFO + BINTOC(hGlobalFrom, '4RS')
Аналогичные действия выполняем и для получения указателя на строку, содержащую спецификацию конечных файлов - если код операции не удаление файлов. Для операции удаления вместо указателя помещаем в структуру ноль.
Далее формируем значение флага fFlags и добавляем его в структуру. Обратите внимание, что поле для хранения флага - двухбайтовое:
lnFlag = 8 + 256
lcSHFO = lcSHFO + BINTOC(lnFlag, '2RS')
Указанные значения флага определяют, что функция будет запрашивать необходимость создания новой папки и не будет запрашивать необходимость замены при одинаковых именах и типах исходных и конечных файлов.
Дописываем в переменную lcSHFO 12 нулевых байтов - это поля структуры fAnyOperationsAborted, hNameMappings и lpszProgressTitle.
После выполнения файловой операции возвращаем Windows память, выделенную функциями GlobalAlloc:
GlobalFree(hGlobalFrom)
Вы можете проверить содержимое поля fAnyOperationsAborted, которое после успешного выполнения функции будет содержать ноль либо отличное от нуля значение, если операция была прервана пользователем. Вот этот код:
IF CTOBIN(SUBSTR(lcSHFO, 19, 4), '4N') != 0
* Код, выполняющийся, если операция прервана пользователем
ENDIF
При написании раздела мною не ставилась цель дать информацию о всех Windows API функциях, которые вы могли бы применять в ваших приложениях. Главная цель - объяснить, как, пользуясь описанием любой такой функции в MSDN, правильно её объявить в Visual FoxPro и, самое главное, правильно использовать. В следующих разделах этого руководства постоянно будут применяться различные Windows API функции, но уже без такого подробного объяснения, как здесь.
