2023/05/25

讓 Delphi 11 產出的執行檔相容 Windows XP

作者:吳祐賓

 


 

Delphi XE 下熬了很久,就在 2023 年正式升級 Delphi 11 後,才由原本「修理 IDE 的快樂」轉變為「升級後的快樂」,然而這快樂沒有多久,很快的使用者就傳來災情:

無法執行

依稀記得幾年前的 Delphi 研討會有提到新版 Delphi 產出的執行檔無法在 Windows XP 下執行,想不到在 2023 年的今天,仍然會遇到必須要使用 Windows XP 的場合,2001年10月的產物。

難怪每次購買新版 Delphi 時都能下載過往舊版本,是時候再把 Delphi XE 拿出來把玩了! 

你也是這樣想嗎?太天真了。Delphi 11 已經貼心的在編譯器設定裡加入了【PE Header】選項!


PE Header 是什麼,為什麼要設定?

PE 為 Portable Executable 可攜式執行檔的縮寫,目的是告訴 Windows 此執行檔最小可執行的系統版本,讓系統在運行你的程式前,檢查作業系統版本是否符合要求。

設定 PE Header 的目的是在每個系統版本都有自己的 API,若使用到新系統才有的 API,那在舊系統下就會出現無法預期的錯誤,避免發生無法預期的異常,限定最小可執行系統是有需要的。


OS Version 的對應是?

將維基百科的資料整理後得到如下表格:

名稱 發行版本
Windows 11 NT 10.0
Windows 10 NT 10.0
Windows 8.1 NT 6.3
Windows 8 NT 6.2
Windows 7 NT 6.1
Windows Vista NT 6.0
Windows XP 專業版 x64 NT 5.2
Windows XP NT 5.1
Windows ME NT 4.9
Windows 2000 NT 5.0

由上表可知,Delphi 11 編譯器預設相容最小系統是 Windows Vista。


如何設定相容 Windows XP

Project > Options > Building > Linking 底下兩個項目:

  • Set OS version fields in PE header as <major>.<minor>
  • Set subsystem version fields in PE header as <major>.<minor>

設定為發行版本的系統,以 Windows XP 為例就是 5.1。

當然,你也可以使用編譯指令「{$SETPEOSVERSION 5.1}」,並且放在 .dpr 檔案的開頭,就在 program 關鍵字之後,但在 uses 區段之前。例如:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
program Project1;

{$SETPEOSVERSION 5.1}

uses
  Vcl.Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

 

 設定後就可以在 Windows XP 下順利運行。


結論

透過精確的 PE Header 設定,我們成功讓 Delphi 11 的執行檔在 Windows XP 上順利執行。這項解決方案再次證明 Delphi 11 能夠有效提升開發效率。讓我們將重點放在解決問題上,提供確切的步驟和指引,讓讀者能夠迅速實現目標。

在開發軟體時,我們經常面臨不同的系統環境和需求。透過了解並應用 PE Header 的概念,我們可以確保我們的程式在特定的操作系統上順利執行。這種實用性的思維和目的導向的方法,使我們能夠有效地解決問題,並為使用者提供優質的使用體驗。

謹記,在軟體開發的旅程中,不斷學習和適應新技術是至關重要的。同時,我們也應該牢記舊有系統的需求,並提供相容性解決方案,以確保我們的軟體在廣泛的環境中得以運行。

最後,如果你想深入了解更多關於軟體開發的知識和技巧,邀請你關注作者的最新書籍更新。這將是一個超棒的機會,繼續提升你的開發技能,並受益於此書的專業知識和經驗。

讓我們繼續以實用性和效率為導向,不斷進步並創造出更好的軟體體驗!



作者出的書又有更新了,快來看看!



沒有留言:

張貼留言