Форум » Для флейма » Windows10 and MiniGui .... » Ответить

Windows10 and MiniGui ....

Andrey: Есть программа написанная на МиниГуи давно, года 4 назад. Прога создаёт архив в папке C:\WINDOWS\TEMP и отправляет мне на сайт. Проблема появилась в Win10. Архив в папке C:\WINDOWS\TEMP создаётся, но получить размер файла в папке не могу, функция FILESIZE(cFileArxiv) выдаёт ошибку -1. А может и файл и не создаётся. Проверить точно не успел. При смене папки - функция возвращает правильный размер и прога нормально работает. Я так понимаю в Windows10 идёт блокировка на некоторые операции с папкой C:\WINDOWS\TEMP Не знаю какая установлена Windows10 у заказчика, но у меня прога нормально работает и под Windows10 Просьба учесть/отказаться для МиниГуи от операций с работой в папке C:\WINDOWS\TEMP

Ответов - 28, стр: 1 2 All

gfilatov2002: Andrey пишет: учесть/отказаться для МиниГуи от операций с работой в папке C:\WINDOWS\TEMP МиниГуи нигде явно не использует папку C:\WINDOWS\TEMP, в ядре используется только папка, которую вовращает функция GetTempFolder(). Эта установка может быть изменена с помощью указания новой константы TEMP для текущего пользователя

Andrey: gfilatov2002 пишет: МиниГуи нигде явно не использует папку C:\WINDOWS\TEMP Это хорошо ! Как только разберусь с компом заказчика - отпишусь здесь.

Haz: Andrey пишет: Как только разберусь с компом заказчика - отпишусь здесь Ждём продолжения увлккательной истории про комп заказчика. Но вот здесь ей не место, т. к. никакого отношения к теме ветки она не имеет. Это не MiniGui, это даже не просто GUI, я даже стесняюсь предположить что это и не harbour. Скорее всего это ближе к админству Windows и настройках прав пользователей или банальной проверке а был ли мальчик папка


PSP: Andrey, в любой винде есть переменная среды %USERPROFILE%, указывающая на папку профиля пользователя. В ней пользователь имеет полные права. Там можно создавать/изменять/удалять любые папки/файлы с правами текущего пользователя. И, как заметил Haz, Minigui и Harbor тут не при чем.

Dima: Has пишет: Но вот здесь ей не место, т. к. никакого отношения к теме ветки она не имеет. Аминь :) Двинул тему.

Andrey: PSP пишет: Andrey, в любой винде есть переменная среды %USERPROFILE%, указывающая на папку профиля пользователя. В ней пользователь имеет полные права. Там можно создавать/изменять/удалять любые папки/файлы с правами текущего пользователя. Спасибо конечно за эти разъяснения, я эти права правил ещё с ХР без проблем. Но что удивило сейчас, что моя прога на МиниГуи под Win10 у нескольких заказчиков (2-3) начинают глючить... Я не знаю как ихний админ устанавливал, может запреты какие то делал. Шишки то на меня сразу катят, а не на админа. А ещё Антивирусы всякие блокируют программу. Получается борьба с системой, а не работа программы. PSP пишет: И, как заметил Haz, Minigui и Harbor тут не при чем. С этим полностью согласен. На других системах WinXP/7 проблем меньше. Просто хотел убедиться насчёт C:\WINDOWS\TEMP Почему функция FILESIZE(cFileArxiv) выдаёт ошибку -1 ? Хотя ещё нужно проверять что там за права доступа к этой папке... Можно ли получить средствами Харбора - права доступа к папке ?

Pasha: Andrey пишет: Просьба учесть/отказаться для МиниГуи от операций с работой в папке C:\WINDOWS\TEMP Андрей, ну там же твоя программа ? Ты с своих сырцах можешь посмотреть, в лоб берешь папку C:\WINDOWS\TEMP, или вызываешь GetEnv("Temp") ? Тогда это просьба к самому себе получается ? В чем вопрос то ? Есть стоит папка в лоб, то это во многих случаях не будет работать. Винвовс может жить к примеру в D:\Windows, или C:\WINNT, и тогда не только с win10 будут проблемы, а с любой. А так да, win10 защищает много системных папок. Так туда просто не надо лезть.

PSP: Andrey пишет: Можно ли получить средствами Харбора - права доступа к папке ? Это не нужно. Просто используй для временных файлов те папки, в которых заведомо у пользователя есть права.

Haz: Andrey пишет: На других системах WinXP/7 проблем меньше. Просто хотел убедиться насчёт C:\WINDOWS\TEMP Андрей, даже на Win7 к папке C:\WINDOWS\TEMP требуются права администратора. Видимо у клиента впервые нормальный админ попался и не стал раздавать админскую учетку всем попало. Самый простой выход - использовать GetMyDocumentsFolder() и делай там что хочешь

gfilatov2002: Haz пишет: Самый простой выход По итогам обсуждения добавил новую функцию GetUserTempFolder(), которая возвращает путь к скрытой папке для временных файлов текущего пользователя

Haz: gfilatov2002 пишет: По итогам обсуждения добавил новую функцию GetUserTempFolder() Не так ? #xtranslate GetUserTempFolder() => GetEnv("TEMP")

Andrey: Спасибо всем за разъяснения ! Я учту ваши рекомендации. За отдельную функцию - БОЛЬШОЕ спасибо ! В других своих программах я пользовался всегда таким путём: [pre2] cDirTemp := C_getspecialfolder(0x0028)+"\Local Settings\Temp\МояПрограмма\"[/pre2]

gfilatov2002: Haz пишет: Не так ? iif( IsVistaOrLater() , GetUserProfileFolder() + "\AppData\Local\Temp" , cFilePath( GetTempDir() ) ) Если эта функция окажется полезной, то тогда можно будет заменить в ядре вызовы функции GetTempFolder() на GetUserTempFolder()

Pasha: Функция GetTempDir() уже избыточна, так как есть GetEnv("TEMP"), а GetTempDir() возвращает результат тоже из переменных окружения. Брать в лоб местоположение как GetUserProfileFolder() + "\AppData\Local\Temp" в общем случае вряд ли хорошее решение, так как во-первых есть возможность переопределить папку для Temp, и во-вторых - мало ли что придет в голову этим мелкомягким, может они поменяют папку в следующих версиях. Можно было бы немного улучшить формирование имени файла в папке Temp: Вместо скажем cBmpFile := GetTempFolder() + "\LCheck.bmp" использовать более эффективную конструкцию: cBmpFile := hb_FNameMerge( GetEnv("TEMP"), "LCheck.bmp" )

Andrey: Может это - https://msdn.microsoft.com/ru-ru/library/windows/desktop/aa364992(v=vs.85).aspx ? Функция GetTempPath проверяет наличие переменных окружения в следующем порядке и использует первый найденный путь: Путь, указанный переменной среды TMP. Путь, указанный переменной окружения TEMP. Путь, указанный переменной среды USERPROFILE. Каталог Windows. Обратите внимание, что функция не проверяет, существует ли путь, и не проверяет, имеет ли текущий процесс какие-либо права доступа к пути. Функция GetTempPath возвращает правильно отформатированную строку, которая указывает полный путь на основе порядка поиска переменных окружения, как указано ранее. Приложение должно проверять наличие пути и соответствующие права доступа к пути до любого использования для операций ввода-вывода файлов. Вот этого я и не делал ! Не знал об этом ранее.

Dima: Pasha пишет: hb_FNameMerge( GetEnv("TEMP"), "LCheck.bmp" ) Так тоже покатит. GetEnv("TEMP")+"\LCheck.bmp"

Andrey: Haz пишет: Ждём продолжения увлккательной истории про комп заказчика. Но вот здесь ей не место, т. к. никакого отношения к теме ветки она не имеет. Это не MiniGui, это даже не просто GUI, я даже стесняюсь предположить что это и не harbour. Скорее всего это ближе к админству Windows и настройках прав пользователей или банальной проверке а был ли мальчик папка Ты прав и не прав одновременно ! Это оказывается проблема в библиотеке ZIP Харбора. Но и с меня тоже вины не снимает, так как нужно придерживаться правила: Приложение должно проверять наличие пути и соответствующие права доступа к пути до любого использования для операций ввода-вывода файлов. Разобрался я с компом и со своей программой. Это вторая моя программа была написана ещё в 2013 году. Комп с системой - Windows NT 10.0.15063 Система лицензионная (купленная), Пользователь имеет права обычного пользователя. Использую Harbour MiniGUI Extended Edition 17.11 (32-bit) Для архивирования использовался оператор: [pre2] COMPRESS aFiles TO cBackupZip ; ....... LEVEL LEVEL_ZIP OVERWRITE STOREPATH ; ...[/pre2] Использовал библиотеки МойПроект.hbp: [pre2]-lhbmzip -lminizip -lhbzlib[/pre2] Прога честно НЕИЗВЕСТНО КУДА архивировала, а файл самого архива не записывался ! Ошибку при записи не выдавал ! Библиотека создания ZIP наверное древняя с Харбора перенесена. Григорий только там правил hb_ANSIToOEM( cFileToZip ) для меня. Пришлось мне перед архивацией ставить проверку: [pre2] HB_MemoWrit( cBackupZip, "Проверка записи в папку !" ) IF !FILE(cBackupZip) cMsg := "Отказ доступа к папке ! Не могу записать файл !" + CRLF + CRLF cMsg += cBackupZip + CRLF + CRLF cMsg += 'Обращаться к вашему системному администратору !' + CRLF + CRLF MsgStop( cMsg , MSGTITLE ) MySTRFILE( cMsg , LISTING_PROTOCOL, .T. ) // записать протокол RETURN "" ENDIF[/pre2] И ещё вопрос возник с этим компом. Почему функция GetTempFolder() возвращает C:\Users\USER-K~1\AppData\Local\Temp\ ? Т.е. не полное имя, а обгрызанное - \USER-K~1\ ?

Pasha: Andrey пишет: Прога честно НЕИЗВЕСТНО КУДА архивировала, а файл самого архива не записывался ! Ошибку при записи не выдавал ! Ну это же не архиватор с гуи-интерфейсом, или командной строки, чтобы что-то куда-то выдавать. Это функция hb_ZipFile, которая возвращает результат архивации. Его можно проанализировать, если интересно, создался ли архив или нет. Если неинтересно - можно не анализировать, а сразу писать на форум о непонятной проблеме. Библиотека создания ZIP наверное древняя с Харбора перенесена. Так minigui зачем-то тянет с собой много таких библиотек. Правильным решением было бы убрать их из проекта, и рекомендовать использовать соответствующие средства харбора. Почему функция GetTempFolder() возвращает C:\Users\USER-K~1\AppData\Local\Temp\ ? Т.е. не полное имя, а обгрызанное - \USER-K~1\ ? Андрей, про короткие имена файлов ты никогда не слышал, или уже успел забыть ?

Andrey: Pasha пишет: Андрей, про короткие имена файлов ты никогда не слышал, или уже успел забыть ? Да уже забыл ... Просто на этом компе возврат идёт короткого имени, а на других идёт нормально. Вот и спрашиваю, от каких настроек это зависит ? Функция одна, а возврат результата разный. Или я ошибаюсь...

Pasha: У меня возвращает: TEMP=C:\Users\User\AppData\Local\Temp Иногда короткое и длинное имя совпадает, если оно короткое и не содержит русских символов. А насчет настроек: наверное, мелкомягкие просто прозевали, и оставили этот рудимент (короткие имена) в SET TEMP Но разницы никакой нет: короткое и длинное имя обрабатывается одинаково.



полная версия страницы