在Windows和Delphi中实现应用程序的可移植性?

在Windows和Delphi中实现应用程序的可移植性?,windows,delphi,delphi-7,portability,Windows,Delphi,Delphi 7,Portability,我们的应用程序不写入Windows注册表或在用户配置文件中存储其配置文件(如INI文件);相反,它将其配置文件存储在程序的目录中。维基百科有这样的说法 便携式应用程序(portable app)是一种设计用于独立于操作系统运行的计算机软件程序。这种类型的应用程序存储在可移动存储设备上,如CD、USB闪存驱动器、闪存卡,将其程序文件、配置信息和数据单独存储在存储介质上 所以我们的问题是,这是否使我们的应用程序成为一个真正的便携式应用程序(便携式应用程序) 我应该指出,如果应用程序位于写保护介质上,

我们的应用程序不写入Windows注册表或在用户配置文件中存储其配置文件(如INI文件);相反,它将其配置文件存储在程序的目录中。维基百科有这样的说法

便携式应用程序(portable app)是一种设计用于独立于操作系统运行的计算机软件程序。这种类型的应用程序存储在可移动存储设备上,如CD、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;

不要使用
Windows.GetCurrentDirectory()
检索可执行文件的目录。它返回进程的当前工作目录,该目录可以在进程的生存期内动态更改,因此不能保证每次都能获得正确的目录。要可靠地获取应用程序的目录,请改用Sysutils.ExtractFilePath(Sysutils.ParamStr(0))。在内部,它使用
Windows.GetModuleFileName(nil)
获取应用程序的完整路径,然后截断可执行文件名,留下所需的目录路径。

不要使用
Windows.GetCurrentDirectory()
检索可执行文件的目录。它返回进程的当前工作目录,该目录可以在进程的生存期内动态更改,因此不能保证每次都能获得正确的目录。要可靠地获取应用程序的目录,请改用Sysutils.ExtractFilePath(Sysutils.ParamStr(0))。在内部,它使用Windows.GetModuleFileName(nil)获取应用程序的完整路径,然后截断可执行文件名,留下所需的目录路径。

一个真正可移植的应用程序,如果这确实是您的问题,应该:

  • 不需要任何安装
  • 在你复制到的任何地方工作
我自己对便携式应用程序的格式塔定义并不总是要求该应用程序位于只读位置时工作,并且除了这个维基百科参考之外,我不确定它在野外是否是标准的。很高兴你能像维基百科上的文章那样遵守法律条文。你在维基百科的文章中引用的话有点自相矛盾,这让我很恼火;如果定义既要求必须支持CDROM(或您的应用程序不可移植),又指定数据应单独存储在该介质上。你遇到了这种矛盾,现在违反了法律条文的一部分,以避免违反第一部分。因此,这个定义要么阻止你在这种情况下保存任何东西,要么这个定义本身并不是一条法律,你可以自由地做你想做的事情,只要遵循我上面提到的两点

便携应用程序的最低限度定义就是我上面给出的那个,除了这两点,你所做的应该是对你的用户合适的

我真的不明白怎么会有人能在便携性上给你开绿灯。您只能通过测试来真正验证可移植性,理想情况下由一群人进行测试,例如beta测试或fieldtest用户。我也不认为StackOverflow是请求帮助测试二进制文件的好地方。这是一个用来询问编程问题的网站,不是用来进行测试、实地测试等,也不是用来推广你的应用程序。事实上,我不明白我们如何才能安全地从您那里下载二进制代码,而不让我们的系统运行从这里的链接下载的二进制代码。我建议您删除指向二进制文件的链接

我会做的测试:

  • 把它放在一个usb盘上,在几个不同干净的windows系统上的不同PC上运行,包括XP、Vista、Win 7、windows Server 2008的几个服务包级别(XP上没有SP、Sp1、Sp2、Sp3等),以及在几个不同的脏系统上运行(安装了visual studio、delphi、office和各种防病毒系统的系统)

  • 确保您不需要外部运行时BPL/DLL或其他运行时内容,但与可执行文件(并排配置)位于同一文件夹中的除外。这样,您的应用程序运行时不必修改用户路径,也不必担心DLL混乱

  • 检查应用程序中是否没有发生应用程序文件夹外的注册表写入或文件系统写入。SysInternals Process Monitor非常适合这样做


如果这确实是您的问题,那么真正的便携式应用程序应该:

  • 不需要任何安装
  • 在你复制到的任何地方工作
我自己对便携式应用程序的格式塔定义并不总是要求该应用程序位于只读位置时可以工作,除了这个维基百科参考,我不确定它在野外是否是标准的。你试图遵守维基百科文章中阐明的法律条文,这很好。你的引语是维基百科文章中给出的ave包含一点内部矛盾;如果定义都要求必须支持CDROM(或者你的应用程序不可移植)并且还指定数据应该单独存储在该媒体上。您遇到了这种矛盾,现在违反了法律条文的一部分,以避免违反法律条文的第一部分。因此,该定义要么阻止您在这种情况下保存任何内容,要么该定义实际上不是法律本身,并且只要遵循我上面提到的两点,你就可以随心所欲

极小值