Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Почему Delphi показывает несуществующие файлы из-за UAC виртуализации

Delphi , ОС и Железо , Windows

Разработчики, работающие с Delphi, могут столкнуться с неожиданным поведением программы, когда она утверждает, что файл существует, хотя на самом деле его нет. Это может происходить из-за механизма UAC виртуализации, встроенного в операционные системы Windows начиная с Vista. Давайте разберемся в этом вопросе.

Оригинальный код и проблема

program TestApp;
uses
  SysUtils, Dialogs, Windows;
var
  filename: String = 'C:\Program Files (x86)\Some Application\foo.txt';
  fd: TWIN32FindData;
  h: THandle;
begin
  FillChar(fd, SizeOf(fd), 0);
  h := FindFirstFile(PChar(filename), fd);
  if h = INVALID_HANDLE_VALUE then
    ShowMessage('FindFirstFile=false')
  else
  begin
    ShowMessage('FindFirstFile=true');
    FindClose(h);
  end;
  if FileExists(filename) then
    ShowMessage('FileExists=true')
  else
    ShowMessage('FileExists=false');
end.

Когда этот код запускается, функции FindFirstFile и FileExists возвращают True, несмотря на то, что файл в указанном каталоге отсутствует.

Подтвержденный ответ

Проблема заключается в том, что Windows UAC виртуализация может перенаправлять запросы чтения и записи файлов в специальную директорию C:\Users\{username}\AppData\Local\VirtualStore\Program Files (x86). Это означает, что если 32-битное приложение пытается записать файл в защищенный каталог, Windows создает копию файла в VirtualStore вместо того, чтобы возвращать ошибку доступа.

Альтернативный ответ и решение

Чтобы решить эту проблему, необходимо убедиться, что ваше приложение не использует UAC виртуализацию. Это можно сделать, добавив в проект директиву {$R *.res}, которая включает в проект файл ресурсов и соответствующий манифест. В манифесте должен быть указан уровень выполнения asInvoker, который отключает UAC виртуализацию.

program TestApp;
uses
  SysUtils, Dialogs, Windows;
{$R *.res}
var
  filename: String = 'C:\Program Files (x86)\Some Application\foo.txt';
  fd: TWIN32FindData;
  h: THandle;
begin
  // Код программы...
end.

После добавления этой директивы, ваше приложение будет работать как обычно, и функции проверки наличия файла будут возвращать корректные результаты.

Заключение

Важно помнить, что UAC виртуализация может вводить в заблуждение при разработке приложений, использующих защищенные каталоги. Убедитесь, что ваше приложение не использует эту функцию, если это не требуется, и ваш код корректно обрабатывает наличие файлов в защищенных директориях.

Эта статья предназначена для специалистов, работающих с Delphi и Object Pascal, и призвана помочь в понимании и решении проблем, связанных с UAC виртуализацией.

Создано по материалам из источника по ссылке.

Разработчики Delphi сталкиваются с неверной проверкой существования файлов из-за механизма UAC виртуализации в Windows.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: Windows ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-06-16 09:20:59/0.0060739517211914/0