Autor |
Beitrag |
Hochhaus
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: So 22.12.13 19:02
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
|
|
Mathematiker
Beiträge: 2622
Erhaltene Danke: 1447
Win 7, 8.1, 10
Delphi 5, 7, 10.1
|
Verfasst: So 22.12.13 19:08
_________________ Töten im Krieg ist nach meiner Auffassung um nichts besser als gewöhnlicher Mord. Albert Einstein
Für diesen Beitrag haben gedankt: Hochhaus
|
|
Delphi-Laie
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: 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").
Für diesen Beitrag haben gedankt: Hochhaus
|
|
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: So 22.12.13 20:34
Schau hier, das ist aktueller, enthält aber leider auch Fehler...:
www.delphi-treff.de/...s-version-ermitteln/
Hier kann man sich sein Testprogramm selber zusammen basteln:
delphidabbler.com/ar...rticle=23&part=2
Für den Code:
creativecommons.org/licenses/by-nc-sa/2.5/
Einloggen, um Attachments anzusehen!
Zuletzt bearbeitet von hathor am So 22.12.13 21:44, insgesamt 1-mal bearbeitet
Für diesen Beitrag haben gedankt: Hochhaus
|
|
Delphi-Laie
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: 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.
Für diesen Beitrag haben gedankt: Hochhaus
|
|
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: 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
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; |
Für diesen Beitrag haben gedankt: Hochhaus
|
|
Andreas L.
Beiträge: 1703
Erhaltene Danke: 25
Windows Vista / Windows 10
Delphi 2009 Pro (JVCL, DragDrop, rmKlever, ICS, EmbeddedWB, DEC, Indy)
|
Verfasst: Mo 23.12.13 04:39
|
|
Hochhaus
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: 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
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Mo 23.12.13 07:58
Für diesen Beitrag haben gedankt: Hochhaus
|
|
Delphi-Laie
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: 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.
Für diesen Beitrag haben gedankt: Hochhaus
|
|
Hochhaus
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: Do 26.12.13 10:01
hathor hat folgendes geschrieben : | Abfrage des Betriebssystems mit WMI:
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
|
|
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 26.12.13 12:09
Zuletzt bearbeitet von hathor am Fr 27.12.13 16:16, insgesamt 1-mal bearbeitet
Für diesen Beitrag haben gedankt: Hochhaus
|
|
Hochhaus
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: 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
Beiträge: 19285
Erhaltene Danke: 1743
W11 x64 (Chrome, Edge)
Delphi 11 Pro, Oxygene, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
|
Verfasst: Do 26.12.13 13:16
Welches Zeichen ist das denn? Vielleicht 10 oder 13? Versuch doch mal ein Trim.
Für diesen Beitrag haben gedankt: Hochhaus
|
|
Hochhaus
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: 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
|
|
hathor
Ehemaliges Mitglied
Erhaltene Danke: 1
|
Verfasst: Do 26.12.13 14:06
Minimum supported client: Windows XP [desktop apps only]
msdn.microsoft.com/e...05%28v=vs.85%29.aspx
Für WINDOWS-bezogene Fragen findet man leicht Antworten:
Googeln nach "msdn funktionswort"
Zuletzt bearbeitet von hathor am Fr 27.12.13 18:13, insgesamt 1-mal bearbeitet
|
|
Fuchs HP
Hält's aus hier
Beiträge: 1
Erhaltene Danke: 1
Win 7 Professional
Delphi XE2
|
Verfasst: 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
Für diesen Beitrag haben gedankt: Hochhaus
|
|
jasocul
Beiträge: 6388
Erhaltene Danke: 146
Windows 7 + Windows 10
Sydney Prof + CE
|
Verfasst: 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.
Für diesen Beitrag haben gedankt: Hochhaus
|
|
Hochhaus
Beiträge: 662
Erhaltene Danke: 8
Windows 7
Delphi XE2
|
Verfasst: 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
Beiträge: 1600
Erhaltene Danke: 232
Delphi 2 - RAD-Studio 10.1 Berlin
|
Verfasst: Fr 27.12.13 16:23
hathor hat folgendes geschrieben : | Hochhaus hat folgendes geschrieben : | Funktioniert Dein Quellcode auch bei XP und 2000 etc. ?
Hochhaus |
Wieso willst Du das wissen?
Ich habe nicht den Eindruck, dass Du Programme entwickeln kannst!
Minimum supported client: Windows XP [desktop apps only]
msdn.microsoft.com/e...05%28v=vs.85%29.aspx |
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).
|
|
|