[Delphi] Windows versie bepalen

Pagina: 1
Acties:
  • 102 views sinds 30-01-2008
  • Reageer

  • Spinal
  • Registratie: Februari 2001
  • Laatst online: 04-09 14:27
Het schijnt te kunnen met een of andere API functie maar daar kan ik niks mee...
Weet iemand hoe je de windows versie kunt bepalen in Delphi 5?

Full-stack webdeveloper in Groningen


  • the_dgc
  • Registratie: Augustus 2001
  • Laatst online: 18-11-2022

the_dgc

raar he..... leven!!

Op maandag 13 mei 2002 20:37 schreef ZanderZ het volgende:
Het schijnt te kunnen met een of andere API functie maar daar kan ik niks mee...
Weet iemand hoe je de windows versie kunt bepalen in Delphi 5?
ik zou het niet weten. maar misschien kun je het vinden op http://www.experts-exchange.com/ dit is ook een soort forum maar met veel meer hulp over programeertalen e.d.
ook daar moet je je eigen aanmelden ook gelden daar wat meer voorwaarden maar die moet je maar op de site lezen

een wereld zonder vrede.. raar?? kijk om je heen dan merkje dat het heel normaal is...
neeeh ik ben niet druk, jij bent gewoon te rustig !!
dual xeon 2.4, 1024 intern, gf3 ti200, maxtor 60 gb 7200 rpm en nog wat opvulling


  • jvreuls
  • Registratie: Januari 2002
  • Laatst online: 31-07 13:13
Zo misschien?
code:
1
2
3
4
5
6
7
var OSVersion : OSVERSIONINFO;
begin
    OSVersion.dwOSVersionInfoSize := SizeOf(OSVersion);
    GetVersionEx(OSVersion);
    Label1.Caption := IntToStr(OSVersion.dwMajorVersion)
      + '.' + IntToStr(OSVersion.dwMinorVersion);
end;

In die OSVersion structure zit nog meer, maar dat staat allemaal in de Win32 API guide.
Btw: bedoel je nu dat je de API niet kan of wil gebruiken? Vanuit Delphi kan het volgens mij niet.

Circuits Online


Verwijderd

Voor dit soort zaken, zou ik altijd ff in de JCL van Jedi kijken. Deze heeft een functie GetWindowsVersion, die denk ik doet wat jij wil.

  • WOmBaT
  • Registratie: September 2000
  • Laatst online: 30-11-2025

WOmBaT

Nyaaa!!!

Op www.delphi3000.com staan in ieder geval 2 voorbeelden van functies die precies kunnen zeggen welke windowsversie je draait. Wel ff registeren voor een (gratis) brons lidmaatschap. :)

  • Creepy
  • Registratie: Juni 2001
  • Laatst online: 00:21

Creepy

Tactical Espionage Splatterer

Op maandag 13 mei 2002 21:38 schreef jvreuls het volgende:
Btw: bedoel je nu dat je de API niet kan of wil gebruiken? Vanuit Delphi kan het volgens mij niet.
Windows API calls vanuit Delphi gaan prima hoor. Uses windows en desnoods ook nog shellapi en de meeste API calls heb je tot je beschikking.

Mocht je een API call willen gebruiken en die functie is om 1 of andere reden niet aan te spreken vanuit Delphi, declareer hem dan zelf (function blaat(paramshier): pchar; stdcall; external 'win32.nll') of kijk op de al eerder genoemde Delphi Jedi site, waar ze voor zo'n beetje elke API wel een delphi wrapper hebben..

"I had a problem, I solved it with regular expressions. Now I have two problems". That's shows a lack of appreciation for regular expressions: "I know have _star_ problems" --Kevlin Henney


  • jvreuls
  • Registratie: Januari 2002
  • Laatst online: 31-07 13:13
Nou, dat bedoelde ik niet. Ik dacht soms dat Delphi een ingebouwde functie voor de windowsversie had. Dat API calls vanuit Delphi perfect werken weet ik.

Circuits Online


  • Kool
  • Registratie: September 1999
  • Niet online
In Delphi 6 kun je Win32MajorVersion enz. gebruiken. Weet niet of het ook al in D5 zit.

  • Elissen
  • Registratie: Januari 2000
  • Laatst online: 27-07 15:54
Het beste kan je het opvragen met GetVersionEx, je kunt dan zelfs het verschil zien tussen een 2000 Prof, Server, Adv. Server enz.

zie ook:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/sysinfo_49iw.asp
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/sysinfo/sysinfo_92jy.asp

(Ik heb dat voorbeeld in Delphi, maar niet bij de hand. Ben nu op school).

  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 09:08

Tomatoman

Fulltime prutser

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
function WinVersion: string;
begin
  case Win32MajorVersion of
    3: // NT 3.51
    Result := 'Windows NT 3.51';
    4: // Win9x/ME, NT 4
    case Win32MinorVersion of
      0:
        Result := 'Windows 95';
      10:
        Result := 'Windows 98';
      90:
        Result := 'Windows ME';
    else
      if (Win32Platform and VER_PLATFORM_WIN32_NT) <> 0 then
        Result := 'Windows NT 4.0'
      else
        Result := 'unknown';
    end;
    5: // Win2K, XP
    case Win32MinorVersion of
      0:
        Result := 'Windows 2000';
      1:
        Result := 'Windows XP or .NET server';
    else
      Result := 'unknown';
    end;
  else
    Result := 'unknown';
  end;
end;

Een goede grap mag vrienden kosten.


  • Elissen
  • Registratie: Januari 2000
  • Laatst online: 27-07 15:54
Komt 'ie, volledig vertaald voorbeeld van MS. Werkt bij mij tot nu toe bij elke windows (vanaf '95 en NT4. zou ook onder NT 3.51 moeten werken).

Er staan wel een paar extra dingen in, maar als dingen niet in Delphi staan en ik moet de uit de header-files van de Platform SDK halen, dan neem ik die gelijk mee.
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
uses
  Windows, Registry, SysUtils;

const
  VER_PLATFORM_WIN32s     = 0;
  VER_PLATFORM_WIN32_WINDOWS = 1;
  VER_PLATFORM_WIN32_NT = 2;

  VER_NT_WORKSTATION       = 1;
  VER_NT_DOMAIN_CONTROLLER   = 2;
  VER_NT_SERVER       = 3;

  VER_SERVER_NT            = $80000000;
  VER_WORKSTATION_NT            =  $40000000;
  VER_SUITE_SMALLBUSINESS        =  $00000001;
  VER_SUITE_ENTERPRISE        =  $00000002;
  VER_SUITE_BACKOFFICE        =  $00000004;
  VER_SUITE_COMMUNICATIONS      =  $00000008;
  VER_SUITE_TERMINAL            =  $00000010;
  VER_SUITE_SMALLBUSINESS_RESTRICTED=  $00000020;
  VER_SUITE_EMBEDDEDNT        =  $00000040;
  VER_SUITE_DATACENTER        =  $00000080;
  VER_SUITE_SINGLEUSERTS        =  $00000100;
  VER_SUITE_PERSONAL            =  $00000200;
  VER_SUITE_BLADE            =  $00000400;

type
  POSVersionInfoExA = ^TOSVersionInfoExA;
  POSVersionInfoExW = ^TOSVersionInfoExW;
  POSVersionInfoEx = POSVersionInfoExA;
  _OSVERSIONINFOEXA = record
    dwOSVersionInfoSize : DWORD;
    dwMajorVersion : DWORD;
    dwMinorVersion : DWORD;
    dwBuildNumber : DWORD;
    dwPlatformId : DWORD;
    szCSDVersion : array [0..127] of AnsiChar;
    wServicePackMajor : Word;
    wServicePackMinor : Word;
    wSuiteMask : Word;
    wProductType : Byte;
    wReserved : Byte;
  end;
  _OSVERSIONINFOEXW = record
    dwOSVersionInfoSize : DWORD;
    dwMajorVersion : DWORD;
    dwMinorVersion : DWORD;
    dwBuildNumber : DWORD;
    dwPlatformId : DWORD;
    szCSDVersion : array [0..127] of WideChar;
    wServicePackMajor : Word;
    wServicePackMinor : Word;
    wSuiteMask : Word;
    wProductType : Byte;
    wReserved : Byte;
  end;
  OSVERSIONINFOEX = _OSVERSIONINFOEXA;
  LPOSVERSIONINFOEX = ^_OSVERSIONINFOEXA;
  TOSVersionInfoEx = _OSVERSIONINFOEXA;
  TOSVersionInfoExA = _OSVERSIONINFOEXA;
  TOSVersionInfoExW = _OSVERSIONINFOEXW;

function GetVersion_(lpVersionInformation: pointer): BOOL; stdcall; external kernel32 name 'GetVersionA';
function GetVersionA_(lpVersionInformation: pointer): BOOL; stdcall; external kernel32 name 'GetVersionA';
function GetVersionW_(lpVersionInformation: pointer): BOOL; stdcall; external kernel32 name 'GetVersionW';
function GetVersionEx_(lpVersionInformation: pointer): BOOL; stdcall; external kernel32 name 'GetVersionExA';
function GetVersionExA_(lpVersionInformation: pointer): BOOL; stdcall; external kernel32 name 'GetVersionExA';
function GetVersionExW_(lpVersionInformation: pointer): BOOL; stdcall; external kernel32 name 'GetVersionExW';

function GetWindowsVersion : string;
var
  OSVI : TOSVersionInfoEx;
  bOsVersionInfoEx : Boolean;
  sName, sTemp : string;
  reg : TRegistry;
begin
  sName := '';
  // Try calling GetVersionEx using the OSVERSIONINFOEX structure.
  // If that fails, try using the OSVERSIONINFO structure.

  FillChar(OSVI, sizeof(OSVI), 0);
  osvi.dwOSVersionInfoSize := sizeof(OSVERSIONINFOEX);

  bOsVersionInfoEx := ord(GetVersionEx_(@OSVI)) <> 0;
  if not bOsVersionInfoEx then begin
    // If OSVERSIONINFOEX doesn't work, try OSVERSIONINFO.
    osvi.dwOSVersionInfoSize := sizeof (OSVERSIONINFO);
    if ord(GetVersionEx_(@OSVI)) = 0 then
    raise Exception.Create('Fout bij ophalen GetVersionEx');
  end;

  case OSVI.dwPlatformId of
    // Tests for Windows NT product family.
    VER_PLATFORM_WIN32_NT:
    begin
    // Test for the product.
      if osvi.dwMajorVersion <= 4 then
        sName := sName + 'Microsoft Windows NT ';
      if (osvi.dwMajorVersion = 5) and (osvi.dwMinorVersion = 0) then
        sName := sName + 'Microsoft Windows 2000 ';

      if bOsVersionInfoEx then begin  // Use information from GetVersionEx.
      // Test for the workstation type.
        if osvi.wProductType = VER_NT_WORKSTATION then begin
        if (osvi.dwMajorVersion = 5) and (osvi.dwMinorVersion = 1) then begin
          if (osvi.wSuiteMask and VER_SUITE_PERSONAL) = VER_SUITE_PERSONAL then
            sName := sName + 'Microsoft Windows XP Home Edition '
          else
            sName := sName + 'Microsoft Windows XP Professional ';
        end
       // Test for the server type.
        else
        if osvi.wProductType = VER_NT_SERVER then begin
        if (osvi.dwMajorVersion = 5) and (osvi.dwMinorVersion = 1) then
          sName := sName + 'Microsoft Windows .NET ';
        if (osvi.wSuiteMask and VER_SUITE_DATACENTER) = VER_SUITE_DATACENTER then
          sName := sName + 'DataCenter Server '
        else
        if (osvi.wSuiteMask and VER_SUITE_ENTERPRISE) = VER_SUITE_ENTERPRISE then begin
          if osvi.dwMajorVersion = 4 then
            Result := sName + 'Advanced Server '
          else
            Result := sName + 'Enterprise Server ';
        end else
        if (osvi.wSuiteMask and VER_SUITE_BLADE) = VER_SUITE_BLADE then
          Result := sName + 'Web Server '
        else
          Result := sName + 'Server ';
        end;
      end
      else   // Use the registry on early versions of Windows NT.
      begin
        reg := TRegistry.Create(KEY_READ);
        reg.RootKey := HKEY_LOCAL_MACHINE;
        if reg.OpenKeyReadOnly('SYSTEM\CurrentControlSet\Control\ProductOptions') then begin
        sTemp := reg.ReadString('ProductType');
        sTemp := UpperCase(Trim(sTemp));
        if sTemp = 'WINNT' then
          sName := sName + 'Professional '
        else if sTemp = 'LANMANNT' then
          sName := sName + 'Server '
        else if sTemp = 'SERVERNT' then
          sName := sName + 'Advanced Server ';
        end;
        reg.Free;
      end;
    // Display version, service pack (if any), and build number.
      if osvi.dwMajorVersion <= 4 then
        sName := sName + Format('version %d.%d %s (Build %d)',[osvi.dwMajorVersion,
          osvi.dwMinorVersion, osvi.szCSDVersion, osvi.dwBuildNumber and $FFFF])
      else
        sName := sName + Format('%s (Build %d)', [osvi.szCSDVersion, osvi.dwBuildNumber and $FFFF]);
    end;
    end;
    // Test for the Windows 95 product family.
    VER_PLATFORM_WIN32_WINDOWS:
    begin
    if osvi.dwMajorVersion = 4 then begin
      if osvi.dwMinorVersion = 0 then begin
        sName := sName + 'Microsoft Windows 95 ';
        if (osvi.szCSDVersion[1] = 'C') or (osvi.szCSDVersion[1] = 'B') then
        sName := sName + 'OSR2 ';
      end;
      if osvi.dwMinorVersion = 10 then begin
        sName := sName + 'Microsoft Windows 98 ';
        if osvi.szCSDVersion[1] = 'A' then
        sName := sName + 'SE ';
      end;
      if osvi.dwMinorVersion = 90 then
        sName := sName + 'Microsoft Windows Millennium Edition ';
    end;
    end;
  end;
  Result := sName;
end;

Sorry voor de layout :)

  • Spinal
  • Registratie: Februari 2001
  • Laatst online: 04-09 14:27
Hartstikke bedankt! Ik ga het straks proberen!

Full-stack webdeveloper in Groningen

Pagina: 1