2017-03-02 54 views
-8

簡單的問題:如何使用Delphi 2007以可靠的方式檢測Windows版本?有沒有辦法做到這一點沒有API,即只檢查系統目錄中的一些文件夾或文件?在Delphi 2007上檢測Windows版本沒有API

在此先感謝!

+0

您是否使用* [delphi] windows版本*進行搜索時檢查了以前的所有2000個帖子?只是好奇心,爲什麼你要避開API? –

+3

因爲他想在未來版本的Windows中增加他的代碼破解的可能性。你知道......工作安全! –

+0

@TomBrunberg是的,但大多數依賴於API,這就是我想要避免的。 – delphirules

回答

8

如果不調用Windows API函數,則無法檢查文件或註冊表值!

在不調用任何API的情況下檢查版本的唯一方法是從PEB中讀取,但大多數字段的值爲undocumented,理論上可能會從版本更改爲版本。它也受兼容墊片的影響。我不建議你這樣做,但如果你堅持,那麼this code可能是一個很好的起點,只需閱讀OSMajorVersionOSMinorVersion成員(TebGetTebPeb := Teb.PebTeb)。

Microsoft建議您檢查您需要的功能是否存在,而不是檢查版本。推薦的方法檢查版本是VerifyVersionInfo,但如果您需要版本號用於顯示目的,您仍然可以繼續使用已棄用的GetVersionEx。這兩個函數require a manifest在Windows 8.1和10上獲得正確的版本。

+0

在Windows 10上,VerifyVersionInfo()受制於顯示,與Win8.1以上的GetVersionEx()相同。還有其他幾個API函數可用於獲取真正的操作系統版本號而無需顯示。 –

+0

[本問答](http://stackoverflow.com/q/36543301/1889329)解釋瞭如何在沒有任何清單的情況下檢測真正的操作系統版本。 – IInspectable

+0

@IInspectable它不是真正的版本,它仍然受到兼容性墊片的影響。 – Anders

0

理論上,您可以解析EXPLORER.EXE的version details,然後推測Windows版本。但是每個Delphi版本都會再次使用Pascal的blockread()實現WinApi。並且想要找到Windows目錄(可以在任何驅動器上有任何名稱)也會再次導致WinApi調用。