在Windows和Delphi中实现应用程序的可移植性?
我们的应用程序不写入Windows注册表或在用户配置文件中存储其配置文件(如INI文件);相反,它将其配置文件存储在程序的目录中。维基百科有这样的说法 便携式应用程序(portable app)是一种设计用于独立于操作系统运行的计算机软件程序。这种类型的应用程序存储在可移动存储设备上,如CD、USB闪存驱动器、闪存卡,将其程序文件、配置信息和数据单独存储在存储介质上 所以我们的问题是,这是否使我们的应用程序成为一个真正的便携式应用程序(便携式应用程序) 我应该指出,如果应用程序位于写保护介质上,我们使用下面的函数,因此它不会尝试写入该介质在Windows和Delphi中实现应用程序的可移植性?,windows,delphi,delphi-7,portability,Windows,Delphi,Delphi 7,Portability,我们的应用程序不写入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)获取应用程序的完整路径,然后截断可执行文件名,留下所需的目录路径。一个真正可移植的应用程序,如果这确实是您的问题,应该:
- 不需要任何安装
- 在你复制到的任何地方工作
- 把它放在一个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非常适合这样做
- 不需要任何安装
- 在你复制到的任何地方工作