2011-07-16 86 views
1

我們有這個應用程序不寫入Windows註冊表或將其配置文件(例如INI文件)存儲在用戶的配置文件中;相反,它將其配置文件存儲在程序的目錄中。維基百科有這樣的說法在Windows和Delphi中實現應用程序可移植性?

便攜式應用程序(便攜式應用程序)是一種計算機軟件程序,旨在獨立於操作系統運行。此類應用程序存儲在可移動存儲設備上,如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; 
+0

沒有去。 'DrWeb \t 5.0.2.03300 \t 2011.07.16 \t Trojan.MulDrop.35563' –

+2

是什麼意思評論? –

+1

@downvoter不確定你的意思,沒有病毒!其他人是否知道這傢伙說的? – eyeClaxton

回答

6

請勿使用Windows.GetCurrentDirectory()來檢索可執行文件的目錄。它返回進程的當前工作目錄,它可以在進程的生命週期內動態改變,所以你不能保證每次都得到正確的目錄。要可靠地獲取應用程序目錄,請改用Sysutils.ExtractFilePath(Sysutils.ParamStr(0))。在內部,這使用Windows.GetModuleFileName(nil)來獲取應用程序的完整路徑,然後截斷可執行文件名稱,並留下所需的目錄路徑。

+0

謝謝,更改已應用。 – eyeClaxton

11

一個真正的便攜式應用中,如果這是真的你的問題,應該:

  • 不按規定不得以任何安裝。
  • 工作在任何你複製到的地方。便攜式應用的

我自己的完形定義並不總是要求,當它位於一個只讀的地方,比這個維基百科參考其他應用程序的工作,我不知道它的標準狂野。很高興您試圖按照維基百科文章中所述的法律信函進行操作。它讓我感到厭煩,你從維基百科文章中給出的引用包含一些內部矛盾;如果定義都期望必須支持CDROM(或者您的應用程序不可移植)並且還指定數據應該單獨存儲在該媒體上。你遇到了這個矛盾,現在正在違反法律的一部分,以避免違反第一部分。所以這個定義要麼在這種情況下阻止你保存任何東西,要麼這個定義事實上並不是一個自己的規律,只要你遵循上面提到的兩點,你可以隨心所欲地去做。

便攜式應用程序的極簡主義定義就是我上面給出的一個定義,除了這兩點之外,你應該做什麼都適合你的用戶。

我真的不明白SO上的任何人都可以給你帶來便攜性的綠燈。您只能通過測試來真正驗證可移植性,並且理想情況下由一組人員(如beta測試或fieldtest用戶)進行測試。我也沒有看到StackOverflow是幫助測試二進制文件請求的好地方。這是一個提出編程問題的網站,不是用於形成beta測試,現場測試等,也不是爲了推廣您的應用。事實上,我沒有看到我們如何安全地從您的網站下載二進制代碼,而不是冒着我們的系統運行我們從鏈接下載的二進制代碼的風險。我建議你刪除鏈接到二進制文件。

測試中,我會做:

  • 把它放在一個USB密鑰,並在幾個不同的電腦上幾個不同的乾淨的Windows系統,包括XP,Vista中,運7,Windows Server 2008中的幾個運行服務包級別(在XP上沒有SP,Sp1,Sp2,Sp3等)以及幾個不同的髒系統(安裝了visual studio的系統,安裝了delphi,安裝了辦公軟件和各種防病毒系統)。

  • 確保您無需外部運行BPLs/DLL或其他運行時的東西,除了那些位於同一文件夾作爲可執行文件(並排配置側)。這樣,用戶的路徑就不必修改,以便應用程序正常工作,而且您不必擔心DLL地獄混亂。

  • 檢查沒有寫入註冊表或者文件系統寫的應用程序文件夾之外發生在你的應用程序。 SysInternals Process Monitor對此非常有用。

相關問題