当前位置: 动力学知识库 > 问答 > 编程问答 >

Achieving application portability within Windows and Delphi?

问题描述:

We have this application that does not write to the Windows registry or store its configuration files (such as an INI file) in the user's profile; instead, it stores its configuration files in the program's directory. Wikipedia has this statement

A portable application (portable app) is a computer software program designed to run independently from an operating system. This type of application is stored on a removable storage device such as a CD, USB flash drive, flash card - storing its program files, configuration information and data on the storage medium alone.

so our question is, does this make our application a true portable application (portable app)?

I should point out that if the application is on a write protected medium we use the function below, so it doesn't try to write to that medium.

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;

网友答案:

Do not use Windows.GetCurrentDirectory() to retrieve the executable file's directory. It returns the process's current working directory, which can change dynamically during the process's lifetime, so you are not guaranteed to get the correct directory every time. To get the app's directory reliably, use Sysutils.ExtractFilePath(Sysutils.ParamStr(0)) instead. Internally, this uses Windows.GetModuleFileName(nil) to get the full path of your app and then truncates off the executable name, leaving the desired directory path.

网友答案:

A truly portable application, if that is truly your question, should:

  • Not require any installation whatsoever.
  • Work anywhere you copy it to.

My own gestalt definition of a portable app does not always require that the app work when it is located on a read-only place, and other than this wikipedia reference, I am not sure that it's standard in the wild. It's great that you're trying to follow the letter of the law as spelled out in Wikipedia articles. It irks me that the quote you have given from the Wikipedia article contains a bit of an internal contradiction; if the definition both expects that a CDROM must be supported (or your app is not portable) and also specifies that the data should be stored on that media alone. You have run into that contradiction, and are now violating one part of the letter of the law, to avoid violating the first part of it. So the definition either prevents you from saving anything at all in that case, or that definition isn't in fact, a law unto itself, and you're free to do as you like, provided the two points I mention above are followed.

A minimalist definition of portable app is the one I gave above, and what you do beyond those two points, should be whatever is right for your users.

I really don't see how anyone on SO can give you a green light on portability. You can only truly verify portability by testing, and ideally testing by a group of people, such as beta test or fieldtest users. I also don't see StackOverflow as a good place for requests for help testing binaries. This is a site for asking programming questions, not for forming beta tests, field-tests etc, or for promoting your app. In fact I don't see how we could safely download a binary from you and not be risking our systems running binary code we downloaded from links here. I recommend you remove the link to the binaries.

Tests I would do:

  • Put it on a usb key, and run it on several different PCs on several different clean windows systems, including XP, Vista, Win 7, Windows Server 2008 at several service pack levels (no SP, Sp1, Sp2, Sp3 on XP etc), and on several different dirty systems (systems with visual studio installed, delphi installed, office installed, and various anti-virus systems).

  • Be sure you require no external runtime BPLs/DLLs or other runtime stuff, except those located in the same folder as your executable (side by side configuration). That way the user's path does not have to be modified for your app to work, and you don't have to worry about DLL hell confusion.

  • Check that no registry writes or filesystem writes outside the app folder occur in your app. SysInternals Process Monitor is great for this.

分享给朋友:
您可能感兴趣的文章:
随机阅读: