2017-03-02 1 views
-8

간단한 질문 : Delphi 2007을 사용하여 Windows 버전을 안정적으로 검색하는 방법은 무엇입니까? 거기에 API를하지 않고 그것을 할 수있는 방법은, 즉, 일부 폴더 또는 시스템 디렉토리에있는 파일을 확인?API가없는 Delphi 2007에서 Windows 버전 감지

미리 감사드립니다.

+0

* [delphi] windows 버전 *으로 검색 할 때 이전 2000 개의 게시물을 모두 확인 했습니까? 호기심 때문에, 왜 API를 피합니까? –

+3

그는 이후 버전의 Windows에서 코드 위반 가능성을 높이기 위해 노력하고 있습니다. 있잖아 ... 직업 안정! –

+0

@TomBrunberg 예,하지만 대부분은 API에 의존합니다. 이것이 내가 피하려고하는 것입니다. – delphirules

답변

8

Windows API 함수를 호출하지 않고 파일이나 레지스트리 값을 확인할 수 없습니다!

API를 호출하지 않고 버전을 확인하는 유일한 방법은 PEB에서 읽는 것이지만 대부분의 필드에는 undocumented이 있으며 이론적으로 버전이 변경 될 수 있습니다. 호환성 shim의 영향을받습니다. 나는 이것을 권장하지 않지만 this code이 좋은 출발점 일 수 있다고 주장하는 경우 OSMajorVersionOSMinorVersion 회원 (Teb : GetTebPeb := Teb.Peb : Teb)을 읽으십시오.

버전을 확인하는 대신 필요한 기능이 있는지 확인하는 것이 좋습니다. 권장 버전 확인 방법은 VerifyVersionInfo이지만 표시 목적으로 버전 번호가 필요한 경우 더 이상 지원되지 않는 GetVersionEx을 계속 사용할 수 있습니다. 이 두 가지 기능 모두 Windows 8.1 및 10에서 올바른 버전을 얻으려면 require a manifest을 사용하십시오.

+0

Windows 10에서 VerifyVersionInfo()는 Win8.1 이후 버전의 GetVersionEx()와 동일하게 나타납니다. 명시되지 않으면 진정한 OS 버전 번호를 얻을 수있는 몇 가지 다른 API 함수가 있습니다. –

+0

[이 Q & A] (http://stackoverflow.com/q/36543301/1889329)에서는 매니 페스트가없는 경우 실제 OS 버전을 검색하는 방법에 대해 설명합니다. – IInspectable

+0

@IInspectable 사실 버전이 아니며 호환성 shim의 영향을받습니다. – Anders

0

이론적으로 EXPLORER.EXE를 version details으로 구문 분석 한 다음 Windows 버전을 추측 할 수 있습니다. 그러나 모든 Delphi 버전은 Pascal의 blockread() 구현을 위해 WinApi를 다시 사용합니다. 또한 Windows 디렉터리 (모든 드라이브에 어떤 이름이든 가능)를 찾기를 원할 경우 WinApi를 다시 호출 할 수 있습니다.

관련 문제