Достижение переносимости приложений в Windows и Delphi? - PullRequest
1 голос
/ 17 июля 2011

У нас есть это приложение, которое не записывает данные в реестр Windows и не сохраняет свои файлы конфигурации (например, INI-файл) в профиле пользователя; вместо этого он сохраняет свои файлы конфигурации в каталоге программы. В Википедии есть это утверждение

Переносимое приложение (portable app) - это компьютерная программа, разработанная для работы независимо от операционной системы. Приложение такого типа хранится на съемном устройстве хранения, таком как компакт-диск, флэш-накопитель USB, флэш-карта - для хранения программных файлов, информации о конфигурации и данных только на носителе.

поэтому наш вопрос, делает ли это наше приложение действительно переносимым приложением (портативное приложение)?

Я должен отметить, что если приложение находится на защищенном от записи носителе, мы используем следующую функцию, поэтому оно не пытается выполнить запись на этот носитель.

function GetTempFile(): string;
var
  Buffer: array[0..MAX_PATH] of Char;
begin
  Windows.ZeroMemory(@Buffer, System.SizeOf(Buffer));
  SysUtils.StrPCopy(Buffer, SysUtils.ExcludeTrailingBackslash(SysUtils.ExtractFilePath(System.ParamStr(0))));
  Windows.GetTempFileName(Buffer, '~', 0, Buffer);
  Result := string(Buffer);
end;

function IsMediumWriteProtected(): Boolean;
var
  ErrorMode: Word;
  hHandle: THandle;
begin
  ErrorMode := Windows.SetErrorMode(SEM_FAILCRITICALERRORS);
  try
    hHandle := Windows.CreateFile(PChar(GetTempFile()), GENERIC_WRITE, 0, nil, 
      CREATE_ALWAYS, FILE_ATTRIBUTE_TEMPORARY or FILE_FLAG_DELETE_ON_CLOSE, 0);
    try
      Result := (hHandle = INVALID_HANDLE_VALUE);
    finally
      Windows.CloseHandle(hHandle);
    end;
  finally
    Windows.SetErrorMode(ErrorMode);
  end;
end;

Ответы [ 2 ]

11 голосов
/ 17 июля 2011

Действительно портативное приложение, если это действительно ваш вопрос, должно:

  • Не требует установки.
  • Работайте везде, куда вы копируете.

Мое собственное определение переносного приложения на гештальте не всегда требует , чтобы приложение работало, когда оно находится в месте, доступном только для чтения, и кроме этой ссылки на википедию, я не уверен, что оно стандартное в дикой природе. Это здорово, что вы пытаетесь следовать букве закона, как изложено в статьях Википедии. Меня раздражает, что цитата, которую вы дали из статьи в Википедии, содержит некоторое внутреннее противоречие; если оба определения предполагают, что CDROM должен поддерживаться (или ваше приложение не переносимо), а также указывает, что данные должны храниться только на этом носителе. Вы столкнулись с этим противоречием и теперь нарушаете одну часть буквы закона, чтобы избежать нарушения первой части этого закона. Таким образом, определение либо запрещает вам вообще что-либо сохранять в этом случае, либо это определение на самом деле не является законом само по себе, и вы можете делать все, что хотите, при условии соблюдения двух пунктов, упомянутых выше.

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

Я действительно не понимаю, как кто-либо в SO может дать вам зеленый свет на мобильность. Вы можете по-настоящему проверить мобильность только путем тестирования и, в идеале, тестирования группой людей, например, бета-тестерами или пользователями fieldtest. Я также не вижу StackOverflow как хорошее место для запросов о помощи в тестировании двоичных файлов. Это сайт для того, чтобы задавать вопросы по программированию, а не для формирования бета-тестов, полевых тестов и т. Д. Или для продвижения вашего приложения. На самом деле я не понимаю, как мы могли бы безопасно загрузить двоичный файл от вас и не рисковать нашими системами, использующими двоичный код, который мы загрузили по ссылкам здесь. Я рекомендую вам удалить ссылку на двоичные файлы.

Тесты, которые я бы сделал:

  • Поместите его на USB-ключ и запустите на нескольких разных компьютерах на нескольких разных системах Windows, включая XP, Vista, Win 7, Windows Server 2008 на нескольких уровнях пакета обновления (без SP, Sp1, Sp2 , Sp3 на XP и т. Д.) И на нескольких разных грязных системах (системах с установленной Visual Studio, установленной Delphi, установленной в офисе и различными антивирусными системами).

  • Убедитесь, что вам не требуются внешние BPL / DLL библиотеки времени выполнения или другие компоненты времени выполнения, кроме тех, которые находятся в той же папке, что и ваш исполняемый файл (конфигурация рядом друг с другом). Таким образом, путь пользователя не должен быть изменен, чтобы ваше приложение работало, и вам не нужно беспокоиться о путанице в DLL.

  • Убедитесь, что в вашем приложении нет записей реестра или файловой системы вне папки приложения. SysInternals Process Monitor отлично подходит для этого.

6 голосов
/ 17 июля 2011

Не используйте Windows.GetCurrentDirectory() для получения каталога исполняемого файла. Он возвращает текущий рабочий каталог процесса, который может динамически изменяться в течение всего времени жизни процесса, поэтому вы не гарантированно получите правильный каталог каждый раз. Чтобы надежно получить каталог приложения, используйте Sysutils.ExtractFilePath(Sysutils.ParamStr(0)). Внутренне это использует Windows.GetModuleFileName(nil), чтобы получить полный путь к вашему приложению, а затем обрезает имя исполняемого файла, оставляя желаемый путь к каталогу.

...