![]() Полезное:
Как сделать разговор полезным и приятным
Как сделать объемную звезду своими руками
Как сделать то, что делать не хочется?
Как сделать погремушку
Как сделать так чтобы женщины сами знакомились с вами
Как сделать идею коммерческой
Как сделать хорошую растяжку ног?
Как сделать наш разум здоровым?
Как сделать, чтобы люди обманывали меньше
Вопрос 4. Как сделать так, чтобы вас уважали и ценили?
Как сделать лучше себе и другим людям
Как сделать свидание интересным?
![]() Категории:
АрхитектураАстрономияБиологияГеографияГеологияИнформатикаИскусствоИсторияКулинарияКультураМаркетингМатематикаМедицинаМенеджментОхрана трудаПравоПроизводствоПсихологияРелигияСоциологияСпортТехникаФизикаФилософияХимияЭкологияЭкономикаЭлектроника
![]() |
Функция 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:
Параметр 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, которое после успешного выполнения функции будет содержать ноль либо отличное от нуля значение, если операция была прервана пользователем. Вот этот код: При написании раздела мною не ставилась цель дать информацию о всех Windows API функциях, которые вы могли бы применять в ваших приложениях. Главная цель - объяснить, как, пользуясь описанием любой такой функции в MSDN, правильно её объявить в Visual FoxPro и, самое главное, правильно использовать. В следующих разделах этого руководства постоянно будут применяться различные Windows API функции, но уже без такого подробного объяснения, как здесь. Date: 2015-07-27; view: 1434; Нарушение авторских прав |