Entwickler-Ecke
Windows API - Abfrage des Betriebssystems ?
Hochhaus - So 22.12.13 19:02
Titel: Abfrage des Betriebssystems ?
Hallo allerseits !
kann mir jemand sagen, wie man das Betriebssystem mit einem kurzen Delphi-Programm ermittelt. Es sollte für alle Windows-Versionen ab Win95 funktionieren. (95, NT, 98, 2000, ME, XP, Vista, 7 und 8 / 8.1)
Gibt es solchen Code evtl. hier irgendwo im Forum ?
Vielen Dank für jede Hilfe !
Hochhaus
Moderiert von Narses: Topic aus Sonstiges (Delphi) verschoben am Mo 23.12.2013 um 00:19
Delphi-Laie - So 22.12.13 19:17
Hochhaus hat folgendes geschrieben : |
kann mir jemand sagen, wie man das Betriebssystem mit einem kurzen Delphi-Programm ermittelt. Es sollte für alle Windows-Versionen ab Win95 funktionieren. (95, NT, 98, 2000, ME, XP, Vista, 7 und 8 / 8.1)
Gibt es solchen Code evtl. hier irgendwo im Forum ? |
Auch die Delphipraxis ist voller Diskussionen und Quelltexte zu dieser Thematik. Einfach mal die Mühe des Suchens machen (die meiste Arbeit dabei übernimmt dabei ohnehin der "Mikrochip aus Taiwan").
Delphi-Laie - So 22.12.13 21:36
Wäre noch zu detaillieren, welche Bitanzahl das Betriebsprogramm hat. Auch dafür gibt es verschiedene Möglichkeiten, so über die Bitanzahl eines Pointers oder diese Funktion:
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12:
| function IsWOW64(MyHandle:THandle):Boolean; var IsWow64Result:pBOOL; Is_Wow64Process:function(Handle:THandle;var Res:pBOOL):BOOL;stdcall; begin Is_Wow64Process:=GetProcAddress(GetModuleHandle('kernel32'),'IsWow64Process'); if Assigned(Is_Wow64Process) then begin Is_Wow64Process(MyHandle,IsWow64Result); Result:=Boolean(IsWow64Result) end else Result:=False end; |
Edit: Das ist falsch, die o.g. Funktion dient dazu, festzustellen, ob unter Windows 64 Bit ein Prozeß 32 oder 64 Bit hat. Nimmt man aber einen "Systemprozeß", so kann man damit natürlich doch die Bitanzahl des Betriebsprogrammes feststellen. Sie arbeitet auch unter 32 Bit.
Delete - So 22.12.13 22:41
Abfrage des Betriebssystems mit WMI:
Ausgabe - Beispiele:
Microsoft Windows 8.1 - 6.3.9600
Microsoft Windows 8 - 6.2.9200
Microsoft Windows 7 Ultimate - 6.1.7601
Delphi-Quelltext
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:
| Procedure MM(s: String); begin Form1.Memo1.lines.add(s); end;
function GetWin32_OSNameVersion : string; var objWMIService : OLEVariant; colItems : OLEVariant; colItem : OLEVariant; oEnum : IEnumvariant; iValue : LongWord;
function GetWMIObject(const objectName: String): IDispatch; var chEaten: Integer; BindCtx: IBindCtx; Moniker: IMoniker; begin OleCheck(CreateBindCtx(0, bindCtx)); OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten, Moniker)); OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result)); end;
begin try objWMIService := GetWMIObject('winmgmts:\\localhost\root\cimv2'); colItems := objWMIService.ExecQuery('SELECT * FROM Win32_OperatingSystem','WQL',0); oEnum := IUnknown(colItems._NewEnum) as IEnumVariant; if oEnum.Next(1, colItem, iValue) = 0 then result := Format('%s - %s',[colItem.Caption, colItem.Version]); except result := '?' end; end;
procedure TForm1.FormCreate(Sender: TObject); begin MM(GetWin32_OSNameVersion); end; |
Hochhaus - Mo 23.12.13 07:52
Da muss man sich aber anmelden. Was kostet dort die Benützung der Delphi-Praxis-Seite ? Da es viele versteckte Kostenfallen gibt im Internet, stelle ich diese "dumme" Frage.
Hochhaus
jaenicke - Mo 23.12.13 07:58
Hochhaus hat folgendes geschrieben : |
Da muss man sich aber anmelden. Was kostet dort die Benützung der Delphi-Praxis-Seite ? Da es viele versteckte Kostenfallen gibt im Internet, stelle ich diese "dumme" Frage. |
Entwickler-Ecke, Delphipraxis und Delphi-Treff veranstalten z.B. gemeinsam die Delphi-Tage und viele sind in zwei oder drei der Foren parallel angemeldet, so auch ich. Kosten gibt es dort genauso wenig wie hier. ;-)
Delphi-Laie - Mo 23.12.13 09:42
Meine Äußerungen zur Bitanzahl des Betriebsprogrammes gestern abend waren wohl doch nicht so ganz richtig.
Die Größe des Pointers kann vermutlich nur innerhalb des jeweiligen Programmes bestimmt werden. Klar, daß ein 64-Bit-Programm nur unter einem 64-Bit-Betriebsprogramm läuft (laufen kann) und mithin mit seinem größeren Pointer die 64 Bit anzeigt. Diese Methode scheitert jedoch, wenn man ein 32-Bit-Programm unter einem 64-Bit-Betriebsprogramm startet. Das kann auf diese Weise wohl auch in der 64-Bit-Umgebung nur 32 Bit erkennen, weil ihm nur eine 32-Bit-Umgebung bereitgestellt ("vorgetäuscht") wird, das sog. 32-Bit-Subsystem.
Soeben unter Windows 7 64 Bit ausprobiert: Mein Programm "Prozesse" kann unter Windows 64 Bit sowohl als 32- als auch als 64-Bit-Compilat zwischen 32- und 64-Bit-Prozessen unterscheiden, dazu benutzte ich die oben schon gezeigte Funktion.
Edit: Und noch eine Korrektur: IsWow64Process bestimmt nur, ob ein 32-Bit-Prozeß im 32-Bit-Subsystem läuft. Kann man also auf das eigene Programm anwenden und so die Bitanzahl des Betriebsprogrammes ermitteln, sofern es ein 32-Bit-Compilat ist. Aber das weiß man ja zum Glück vorher, wieviel Bit das eigene Compilat hat.
Wenn man sich nur Monate mit einer Sache nicht beschäftigt, ist schon wieder die Hälfte davon vergessen.
Edit 2: Da die Betriebsprogrammabfrage ja möglichst universell sein soll(te), ist ein 32-Bit-Compilat die erste Wahl und damit die genannte Funktion, auf das eigene Programm angewandt, verwendbar.
Hochhaus - Do 26.12.13 10:01
hathor hat folgendes geschrieben : |
Abfrage des Betriebssystems mit WMI:
Delphi-Quelltext 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:
| Procedure MM(s: String); begin Form1.Memo1.lines.add(s); end;
function GetWin32_OSNameVersion : string; var objWMIService : OLEVariant; colItems : OLEVariant; colItem : OLEVariant; oEnum : IEnumvariant; iValue : LongWord;
function GetWMIObject(const objectName: String): IDispatch; var chEaten: Integer; BindCtx: IBindCtx; Moniker: IMoniker; begin OleCheck(CreateBindCtx(0, bindCtx)); OleCheck(MkParseDisplayName(BindCtx, StringToOleStr(objectName), chEaten, Moniker)); OleCheck(Moniker.BindToObject(BindCtx, nil, IDispatch, Result)); end;
begin try objWMIService := GetWMIObject('winmgmts:\\localhost\root\cimv2'); colItems := objWMIService.ExecQuery('SELECT * FROM Win32_OperatingSystem','WQL',0); oEnum := IUnknown(colItems._NewEnum) as IEnumVariant; if oEnum.Next(1, colItem, iValue) = 0 then result := Format('%s - %s',[colItem.Caption, colItem.Version]); except result := '?' end; end;
procedure TForm1.FormCreate(Sender: TObject); begin MM(GetWin32_OSNameVersion); end; |
|
Hinter Windows Vista kommt ein kleines, schwarzes Rechteck. Was hat das zu bedeuten ? Wieso erscheint nicht, ob es sich um die 32-bit oder 64-bit Variante handelt ? { Bin ich zu anspruchsvoll ? )
Hochhaus
Delete - Do 26.12.13 12:09
Man kann abfragen, ob z.B. ein bestimmter Ordner (SysWOW64) vorhanden ist oder eine bestimmte Funktion.
http://msdn.microsoft.com/en-us/library/windows/desktop/ms724405%28v=vs.85%29.aspx
Delphi-Quelltext
1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| Function GetSystemWow64Directory(lpBuffer:LPTSTR;uSize:Uint):uint; stdcall; external 'Kernel32.dll' name 'GetSystemWow64DirectoryW';
Function IsSysWOW64:Boolean; var Buffer:Array[0..max_path] of Char; begin Result:=false; If GetSystemWow64Directory(Buffer,max_path)<>0 Then result:=true; end;
|
-----------
Delphi-Quelltext
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:
| function Is64BitOS: Boolean; type TIsWow64Process = function(Handle:THandle; var IsWow64 : BOOL) : BOOL; stdcall; var hKernel32 : Integer; IsWow64Process : TIsWow64Process; IsWow64 : BOOL; begin Result := False; hKernel32 := LoadLibrary('kernel32.dll'); if hKernel32 = 0 then RaiseLastOSError; try @IsWow64Process := GetProcAddress(hkernel32, 'IsWow64Process'); if Assigned(IsWow64Process) then begin if (IsWow64Process(GetCurrentProcess, IsWow64)) then begin Result := IsWow64; end else RaiseLastOSError; end; finally FreeLibrary(hKernel32); end; end;
|
Hochhaus - Do 26.12.13 13:08
Danke !! Es bleibt die Frage, wieso hinter Windows Vista ein kleines, schwarzes Quadrat erscheint. Funktioniert Dein Quellcode auch bei XP und 2000 etc. ?
Hochhaus
jaenicke - Do 26.12.13 13:16
Welches Zeichen ist das denn? Vielleicht 10 oder 13? Versuch doch mal ein Trim.
Hochhaus - Do 26.12.13 13:31
Keine Ahnung, welches ANSI-Zeichen das ist. Ich müsste den String zerlegen und prüfen . Heute komme ich aber nicht mehr dazu.
Danke !
Hochhaus
Fuchs HP - Fr 27.12.13 15:07
hathor hat folgendes geschrieben : |
Ich habe nicht den Eindruck, dass Du Programme entwickeln kannst!
Lebst Du eigentlich in einer Diktatur, wo der Gebrauch von GOOGLE verboten ist? |
Hi
bin neu hier ! Aber wie mir scheint, ist der Umgangston ziemlich rüde. Sowas schreibt man doch nicht, auch dann nicht, wenn es stimmen sollte ! Wer kennt schon einen Mitmenschen ganz genau ?
Fuchs Hanspeter
jasocul - Fr 27.12.13 15:32
Ist zwar OT, aber:
Hallo
Fuchs HP,
erstmal Willkommen in der EE.
Der erste Satz ist tatsächlich etwas hart. Anfänger benötigen Lernzeit. Allerdings ist
Hochhaus laut Profil Physiker und 1960 geboren. Da darf man schon etwas mehr erwarten.
Der zweite Satz ist vermutlich aus Frust entstanden, da es User gibt, die schlicht zu faul sind, mal selbst zu googeln und lieber einfach hier fragen. Da das häufiger vorkommt, sind die helfenden User manchmal einfach nur noch genervt. Und dann entstehen solche Frust-Kommentare.
Schreibt man aber nichts, ändern sich solche User nicht.
Wer Einsatz zur Eigen-Kompetenz und -Initiative zeigt, wird auch so freundlich behandelt, wie du es dir vorstellst.
Hochhaus - Fr 27.12.13 15:53
Hallo,
nun möchte ich mich auch dazu äussern: Ich habe durchaus mehrere Projekte geschafft, auch wenn ich manchmal mehr gefragt habe, als unbedingt nötig gewesen wäre. Mit der Programmiersprache selbst habe ich weniger Probleme - eher mit den Windows API - Funktionen (Ich kann weder C noch C++ etc.). Und da helfen mir die Dokumentationen von Microsoft nicht gerade sehr viel weiter. Und auch mit Graphik-Ausgaben kenne ich mich nicht gut aus. Das Quadratwurzelprogramm, das ich einmal geschrieben hatte, benötigt nur Rechenbefehle.
Alles in allem kurz gesagt: Wenn es um reinen Rechencode geht, weiss ich meistens eine Lösung. Systemnahe Programmierung hingegen beherrsche ich nicht - das ist so.
Hochhaus
Delphi-Laie - Fr 27.12.13 16:23
Ausgerechnet Winzigweich - die Höhle des Löwen - als Quelle heranzzuziehen, sollte man ganz vorsichtig sein, von den übrigen Pöbeleien des teilzitierten Beitrages mal ganz abgesehen.
Winzigweich setzt nämlich seit Jahr und Tag dreisterweise die "Minum-supported-...-"-Einträge schleichend einfach so herauf. Und da die das besser wissen, ist das nichts anderes als eine Lüge, aber mit der Ehrlichkeit war diese "Softwareschmiede" noch nie liiert.
Ich fand mal eine chinesische Seite - ich finde sie just leider nicht wieder - in der die Minimum-Anforderungen noch korrekt dargelegt waren, sie war offensichtlich rechtzeitig von den MSDN-Seiten dort hinüber kopiert ("gespiegelt") worden.
Die meisten Funktionen gehen nämlich auf die 9x-, 3x- oder gar noch frühere Windows-Zeiten zurück, manche sogar unverändert (abgesehen von der Bitanzahl-Anpassung).
Bei einer 64-Bit-relevanten Funktion mag die Minimum-Angabe aber tatsächlich stimmen, denn Windows XP 64 Bit war das erste 64-Bit-Windows, das man halbwegs ernstnehmen konnte (halbwegs, weil die folgenden 64-Bit-Varianten immer besser wurden, und davor, das Windows 2000 mit 64 Bit, falls es das wirklich einmal gegeben haben soll, wirklich nur eine Experimentalversion war).
jaenicke - Fr 27.12.13 17:45
Delphi-Laie hat folgendes geschrieben : |
Winzigweich setzt nämlich seit Jahr und Tag dreisterweise die "Minum-supported-...-"-Einträge schleichend einfach so herauf. Und da die das besser wissen, ist das nichts anderes als eine Lüge, aber mit der Ehrlichkeit war diese "Softwareschmiede" noch nie liiert. |
Da steht ja auch "Minimum supported client", und Windows 2000 wird nun einmal nicht mehr unterstützt. :nixweiss:
Delphi-Laie - Fr 27.12.13 19:11
jaenicke hat folgendes geschrieben : |
Delphi-Laie hat folgendes geschrieben : | Winzigweich setzt nämlich seit Jahr und Tag dreisterweise die "Minum-supported-...-"-Einträge schleichend einfach so herauf. Und da die das besser wissen, ist das nichts anderes als eine Lüge, aber mit der Ehrlichkeit war diese "Softwareschmiede" noch nie liiert. | Da steht ja auch "Minimum supported client", und Windows 2000 wird nun einmal nicht mehr unterstützt. :nixweiss: |
Rein grammatikalisch magst Du da rechthaben, Sebastian, allerdings verstand ich es bis dato so, daß es das minimale / "kleinste" Betriebsprogramm ist, das diese Funktion bereitstellt. Und auch nur diese Information ist die eigentlich relevante und sinnvolle, denn welches Betriebsprogramm noch zu unterstützen MS sich herabläßt und welches gerade so noch "supported" wird, kann man wahrlich an anderen, leichter erreichbaren Stellen bei MS & Co. nachlesen.
jaenicke - Fr 27.12.13 21:24
Für die Wartung so alter Programme, die noch Windows 2000 unterstützen müssen, braucht man heute ohnehin spezielle alte Versionen der meisten Entwicklungsumgebungen, spezielle alte Testumgebungen usw., d.h. man muss ohnehin einen hohen Aufwand betreiben. Und dann kann man ja problemlos auch die alten SDK Hilfen installiert vorhalten, wie auch schon in einem anderen Thread erwähnt, in denen auch die uralten Versionen noch berücksichtigt werden.
Die im MSDN angegebene Version ist die minimale Version, die diese Funktion enthält und noch von Microsoft unterstützt wird.
Hochhaus - Sa 28.12.13 12:44
jaenicke hat folgendes geschrieben : |
Für die Wartung so alter Programme, die noch Windows 2000 unterstützen müssen, braucht man heute ohnehin spezielle alte Versionen der meisten Entwicklungsumgebungen (...) |
Deswegen habe ich Delphi 6 PE behalten und nicht weggeworfen nach dem Upgrade auf XE2 !
Hochhaus
jaenicke - Sa 28.12.13 13:07
Bei Delphi XE2 ist doch Delphi 7 dabei, sofern du Professional oder höher hast. Das wäre dann sinnvoller als die alte Personal.
Hochhaus - Sa 28.12.13 15:40
Ich habe in der Tat XE2 Professional. Bisher habe ich aber nicht gemerkt, dass Delphi 7 mit dabei ist. Ich werde mich mal auf die Suche machen. Die Delphi XE2 - Version, die ich habe, habe ich nicht auf DVD. Ich habe nur einen Lizenz-Schlüssel erhalten im Internet, und musste alles downloaden.
Hochhaus
Delphi-Laie - Sa 28.12.13 16:11
Hochhaus hat folgendes geschrieben : |
jaenicke hat folgendes geschrieben : | Für die Wartung so alter Programme, die noch Windows 2000 unterstützen müssen, braucht man heute ohnehin spezielle alte Versionen der meisten Entwicklungsumgebungen (...) |
Deswegen habe ich Delphi 6 PE behalten und nicht weggeworfen nach dem Upgrade auf XE2 ! |
Gegenfrage: Wer wirft denn überhaupt Programme (bzw. deren Datenträger) weg?
Sogar DOS- und 16-Bit-Windows-Programme inkl. der damit erstellten Datendateien und der eigentlichen Betriebsprogramme liegen bei mir fein säuberlich archiviert auf gebrannten Datenträgern, auch wenn ich es seitdem kaum jemals nochmal anrührte.
Hochhaus - Sa 28.12.13 16:35
Delphi-Laie hat folgendes geschrieben : |
Gegenfrage: Wer wirft denn überhaupt Programme (bzw. deren Datenträger) weg?
|
Ich kenne da viele, z.Bsp. meinen Bruder. Ich selbst habe auch noch DOS-Disketten, Win 3.1 / 95 / 98 etc. und werfe sie sicher nicht weg. Auch wenn sie auf der heutigen Hardware kaum noch funktionieren.
Delphi-Laie - Sa 28.12.13 16:48
Hochhaus hat folgendes geschrieben : |
Delphi-Laie hat folgendes geschrieben : |
Gegenfrage: Wer wirft denn überhaupt Programme (bzw. deren Datenträger) weg?
|
Ich kenne da viele, z.Bsp. meinen Bruder. Ich selbst habe auch noch DOS-Disketten, Win 3.1 / 95 / 98 etc. und werfe sie sicher nicht weg. Auch wenn sie auf der heutigen Hardware kaum noch funktionieren. |
Wie ich schon vor Monaten schrieb: Disketten und auch ihre Laufwerke altern leider auch bei völliger Nichtbenutzung spürbar. Gerade die von mir so geschätzten "Waschlappen" (die echten, auch äußerlich biegsamen "floppy discs"), die mit 5,25 Zoll und besserer Zuverlässigkeit als die kleineren, späteren, ernüchterten mich inzwischen mitsamt ihren vergleichsweise klobigen, dafür aber robusten Laufwerken.
CDs hingegen enttäuschten mich bis auf eine Ausnahme bisher nie.
jaenicke - Sa 28.12.13 17:12
Delphi-Laie hat folgendes geschrieben : |
CDs hingegen enttäuschten mich bis auf eine Ausnahme bisher nie. |
Da hatte ich bisher auch nur mit den billigen Rohlingen Probleme, die meine Eltern von Discountern geholt hatten. Meine eigenen sind auch nach 10 Jahren alle noch problemlos lesbar.
Die Originaldisketten von Windows 2 und 3 funktionieren bei mir aber auch noch alle problemlos.
Hochhaus - Sa 28.12.13 17:38
jaenicke hat folgendes geschrieben : |
Welches Zeichen ist das denn? Vielleicht 10 oder 13? Versuch doch mal ein Trim. |
Es ist Zeichen Nr. 153 ! Als ASCII interpretiert ein ö, als ANSI ein Tm ? Was bedeutet dies ?
Hochhaus
Hochhaus - Sa 28.12.13 17:52
Ich glaube jetzt, des Rätsels Lösung zu wissen: Das Zeichen steht für Windows Vista TM ! Bei der Stringausgabe wird es lediglich verkehrt dargestellt !
Hochhaus
//Nachtrag: Die Schrift war zu klein, die Auflösung schlecht - daher die falsche Darstellung. Ein Vergrössern der Schrift auf 12-Punkt war die Problemlösung.
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2024 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!