Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 01.08.2011, 22:00   #11
Vedaslav
Ищите и обрящете!
Пользователь
 
Регистрация: 06.09.2010
Сообщений: 41
По умолчанию

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
Прежде чем начать экспериментировать, рекомендую попробовать показать код и описать, как именно не работает программа (вылетает, зависает, показывает ошибку и т.п.), потому что у меня большое подозрение на то, что проблема не в этом.
Нет никаких ошибок не показывает, не зависает и не вылетает. Суть в следующем: при запуске программы создаётся файл в рабочей папке программы и в этот файл иногда записываются настройки. Для того чтобы просмотреть эти настройки в программе предусмотрена спец. форма с RichEdit и кнопка которая загружает в RichEdit эти даные.
Так вот, в семёрке, если установить программу в папку Program Files, файл для данных создаётся, но настройки туда не записываются и почему-то создаётся ещё один файл путь которого следующий:”C:\Users\Vedaslav\AppDat a\Local\VirtualStore\Program Files\Рабочая папка “ и в него записывается инфа.

Да и ещё C:\Users\Vedaslav\AppData\Local\Vir tualStore\Program Files\ Рабочая папка\файл.txt “ и С:\ Programm File\Рабочая папка\файл.txt ' это
не одно и тоже. Т.е. файлы с одними и теми же названиями находятся в разных местах.
Код выложить не могу, очень большой.
Думаю проблема всё-таки в UAC.

Последний раз редактировалось Vedaslav; 01.08.2011 в 22:17.
Vedaslav вне форума Ответить с цитированием
Старый 01.08.2011, 22:48   #12
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Вы опять врёте или путаете.

Простой эксперимент:
1). Создаём в Program Files папку MyApp.
2). Создаём в папке MyApp файл MyFile.txt, запшем туда строку 'Old content'.
3). Создаём приложение (или берём ваше), располагаем 3 TMemo на форме и пишем такой тестовый код:
Код:
procedure TForm1.FormCreate(Sender: TObject);
var
  Strs: TStringList;
begin
  Strs := TStringList.Create;
  try
    Strs.Clear;
    Strs.LoadFromFile('C:\Program Files\MyApp\MyFile.txt');
    Memo1.Lines.Assign(Strs);

    Strs.Clear;
    Strs.Add('New content!');
    Strs.SaveToFile('C:\Program Files\MyApp\MyFile.txt');

    Strs.Clear;
    Strs.LoadFromFile('C:\Program Files\MyApp\MyFile.txt');
    Memo2.Lines.Assign(Strs);

    Strs.Clear;
    Strs.Add('Another content!');
    Strs.SaveToFile('C:\Program Files\MyApp\MyFile.txt');

    Strs.Clear;
    Strs.LoadFromFile('C:\Program Files\MyApp\MyFile.txt');
    Memo3.Lines.Assign(Strs);
  finally
    FreeAndNil(Strs);
  end;
end;
Этот код трижды читает из файла MyFile.txt и делает в него две записи.
4). Запускаем прогу.

И что же мы видим?

C:\Program Files\MyApp\MyFile.txt действительно не изменился - в нём по-прежнему лежит строка 'Old content'. Но зато был создан файл c:\Users\User Name\AppData\Local\VirtualStore\Pro gram Files\MyApp\MyFile.txt, в котором после прогона программы и будет записано 'Another content!'.

А программа? А программа этого даже не заметила! Первая загрузка загрузила в Memo1 строчку 'Old content' - что и лежало изначально в файле MyFile.txt.

Затем мы записали в файл MyFile.txt строку 'New content!'. И хотя на деле запись пошла в файл c:\Users\User Name\AppData\Local\VirtualStore\Pro gram Files\MyApp\MyFile.txt, программа этого не заметила! Потому что когда она загружает в Memo2 файл C:\Program Files\MyApp\MyFile.txt, то в Memo2 оказывается строка 'New content!' - строка из файла c:\Users\User Name\AppData\Local\VirtualStore\Pro gram Files\MyApp\MyFile.txt, в то время как сам файл C:\Program Files\MyApp\MyFile.txt не был изменён и по-прежнему содержит строку 'Old content'.

Аналогично проходит и вторая запись - изменяется лишь c:\Users\User Name\AppData\Local\VirtualStore\Pro gram Files\MyApp\MyFile.txt.

Иными словами, при первой попытке старой программы записать что-то в системные защищённые папки (Windows, System, Program Files), система создаёт теневую копию файла и в дальнейшем подсовывает её программе. Программе кажется, что она действительно работает с файлом в Program Files, но на самом деле это другой файл, подсунутый ей. Но она этого не видит.

Вот почему я и спрашиваю: в чём, чёрт побери, у вас проблема?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 01.08.2011, 22:57   #13
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Ссылки для чтения:
http://www.gunsmoker.ru/2008/11/uac-vista.html
http://www.gunsmoker.ru/2008/10/vista.html
http://www.gunsmoker.ru/2011/02/dll-...-side.html#uac
http://www.transl-gunsmoker.ru/2010/...tion-data.html
http://www.transl-gunsmoker.ru/2010/...g-post_30.html
http://www.transl-gunsmoker.ru/2009/...g-post_18.html
http://www.transl-gunsmoker.ru/2010/...g-post_29.html
http://www.transl-gunsmoker.ru/2010/...g-post_30.html

Типичный сценарий грамотно написанного приложения:
1). Стационарная версия:
- Устанавливается на машину установщиком, запущенным под администратором.
- Место по умолчанию для установки - Program Files.
- Не требует прав админа для работы.
- В Program Files помещаются исполняемые файлы и неизменные данные (.exe, .DLL, резервный слепок БД и т.п.).
- Настройки хранятся в реестре или в конфигурационном файле (ini, XML, JSON) в AppData (roaming вариант).
- Изменяемые данные, не относящиеся к конфигурации, хранятся в файлах в AppData (local вариант).

2). Мобильная версия:
- Не требует установки.
- Запускается с места, как правило - съёмного накопителя.
- Не требует прав админа для работы.
- Не хранит настройки в реестре.
- Не хранит настройки в AppData.
- Хранит настройки в конфигурационном файле (ini, XML, JSON) в папке запуска.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 01.08.2011, 23:29   #14
NITROGEN_92
Пользователь
 
Регистрация: 25.08.2009
Сообщений: 12
По умолчанию

пиши в другую папку и не парься
NITROGEN_92 вне форума Ответить с цитированием
Старый 01.08.2011, 23:38   #15
Vedaslav
Ищите и обрящете!
Пользователь
 
Регистрация: 06.09.2010
Сообщений: 41
Хорошо

Цитата:
Иными словами, при первой попытке старой программы записать что-то в системные защищённые папки (Windows, System, Program Files), система создаёт теневую копию файла и в дальнейшем подсовывает её программе. Программе кажется, что она действительно работает с файлом в Program Files, но на самом деле это другой файл, подсунутый ей. Но она этого не видит.

Вообще если прогу установить в другой раздел жёсткого диска, то она работает нормально.
Да наверное я что-то напутал в кодинге, потому что программа то записывает данные в теневую копию файла, то не записывает.

Буду разбираться.

Благодарю за помощь GunSmoker
Vedaslav вне форума Ответить с цитированием
Старый 01.08.2011, 23:40   #16
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

"Другой раздел" не является защищённым местом системы (по умолчанию). Там уже может быть что угодно.
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 01.08.2011, 23:41   #17
Vedaslav
Ищите и обрящете!
Пользователь
 
Регистрация: 06.09.2010
Сообщений: 41
По умолчанию

Цитата:
Сообщение от NITROGEN_92 Посмотреть сообщение
пиши в другую папку и не парься
Да придётся писать в другую папку. Просто лень заново переписывать некоторые части программы.
Vedaslav вне форума Ответить с цитированием
Старый 01.08.2011, 23:48   #18
Vedaslav
Ищите и обрящете!
Пользователь
 
Регистрация: 06.09.2010
Сообщений: 41
По умолчанию

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
"Другой раздел" не является защищённым местом системы (по умолчанию). Там уже может быть что угодно.
Да я знаю.
А что делать если у пользователя только один диск, ну например "С" на котором установлена ОС. Получается, что моя прога не сможет записывать свои данные в файл, ведь этот раздел является защищённым, или нет?
Vedaslav вне форума Ответить с цитированием
Старый 01.08.2011, 23:56   #19
GunSmoker
Старожил
 
Регистрация: 13.08.2009
Сообщений: 2,581
По умолчанию

Только что я экспериментом показал, что нет никакой проблемы с записью в защищённое место, не так ли?
Опытный программист на C++ легко решает любые не существующие в Паскале проблемы.
GunSmoker вне форума Ответить с цитированием
Старый 02.08.2011, 00:03   #20
Vedaslav
Ищите и обрящете!
Пользователь
 
Регистрация: 06.09.2010
Сообщений: 41
По умолчанию

Цитата:
Сообщение от GunSmoker Посмотреть сообщение
Только что я экспериментом показал, что нет никакой проблемы с записью в защищённое место, не так ли?
А точно, извиняюсь, вопросов больше нет.
Vedaslav вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Некорректная работа программы... HyperZen Общие вопросы Delphi 2 03.07.2011 10:46
Некорректная работа WPF _-Re@l-_ WPF, UWP, WinRT, XAML 0 19.04.2011 16:05
Некорректная работа с файлами Gapro Общие вопросы Delphi 13 24.03.2011 08:39
Некорректная работа программы при формировании массива @Manya@ Общие вопросы C/C++ 13 22.04.2010 21:40
Некорректная работа Ucoz.ru docbrain WordPress и другие CMS 7 31.03.2010 11:26