32/64Bit Infos auslesen

Anfängerfragen zum Programmieren mit PureBasic.
funk.munich
Beiträge: 123
Registriert: 27.03.2006 09:45

32/64Bit Infos auslesen

Beitrag von funk.munich »

Hallo zusammen,

wie kann ich feststellen, ob das Betriebssystem ein 32 oder 64 Bit System ist? Dies benötige ich, um zu wissen welchen Registry Pfad ich nehmen muss. Unter XP 64Bit werden die meisten Infos ja unter "WOW6432Node" geschrieben.

Danke + Gruß,
Daniel
Benutzeravatar
jpd
Beiträge: 380
Registriert: 14.02.2005 10:33

Beitrag von jpd »

Hi funk.munich,

bei meine x64 Vista gibt die abfrage

Code: Alles auswählen

MessageRequester("OS?", "Number of OSVersion()=" +Str(OSVersion()))
ein ergebnis = 100

leider habe ich keine Vista 32 um diese abfrage zu machen,

kann sein das du vieleicht eine hast? :-)

dann haben wir diese werte..

Ciao

jpd
PB 5.10 Windows 7 x64
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

@funk

du hast XP64?
läuft das gut mit PB?
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
Rings
Beiträge: 977
Registriert: 29.08.2004 08:48

Beitrag von Rings »

siehe http://www.purebasic.fr/english/viewtopic.php?t=17579
iss schon ne zeitlang her zeit ich xp64 einsetze.....
Rings hat geschrieben:ziert sich nich beim zitieren
funk.munich
Beiträge: 123
Registriert: 27.03.2006 09:45

Beitrag von funk.munich »

Hi jpd, H Rings,

danke für die Code Beispiele. Werde ich ausprobieren.

Hm .. ja generell zu 64 Bit.

Wenn Du eine 32 Bit applikation nutzt und z.B. in der Registry Einträge unter SOFTWARE durchscannen willst leitet Dich Microsoft in den Ordner
"HKLM\Software\Wow6432Node\*". Dort werden alle 32 Bit Programme
hingeleitet.
Jedoch müsste ich meistens auf den Standard Pfad "HKLM\Software\*" zugreifen. Das funktioniert aber nur mit 64 bit programmen.

Das gleiche ist im filesystem:
32 -> C:\Program Files
64 -> C:\Program Files (x86)

32 -> C:\WINDOWS\SysWOW64\system32
64 -> C:\WINDOWS\system32

Um dies z.B. zu umgehen würde es reichen, wenn Du ein 64bit programm
hast, dass einfach irgendeine andere datei (32 bit) aufrufen kann.
Dadurch notiert sich MS das dies alles ein 64bit programm ausführt
und somit könnte man auf die Standard Pfade zugreifen.

Das ist natürlich nicht so dolle. Ich habe es aber mit einen kleinen compilierten 64 bit c++ programm mal ausprobiert und es funxt.

Genial wäre natürlich, wenn man mit PB 64 bit kompilieren könnte.

Gruß,
Daniel
Benutzeravatar
jpd
Beiträge: 380
Registriert: 14.02.2005 10:33

Beitrag von jpd »

Hallo funk.munich,

ich habe gemerkt das egal ob vista 32 oder 64 die abfrage OSVersion() immer 100 als return code zurueck gibt.
dadurch nicht wirklich brauchbar.

hier eine variante die durch abfragen der Registry
die gewünschte informationen liefert.

also bei vista home
wird

Windows Vista (TM) Home Basic

liefern
und bei x64 systeme
wird

Windows (TM) Vista Ultimate
64 bit


liefern.
funk.munich hat geschrieben:Jedoch müsste ich meistens auf den Standard Pfad "HKLM\Software\*" zugreifen. Das funktioniert aber nur mit 64 bit programmen.
lesende zugriffe mit 32 bit anwendungen sind aber möglich!

Code: Alles auswählen


Procedure.s GetOS_info(Value.s)
  sTopKey.l = #HKEY_LOCAL_MACHINE
  sKeyName.s = "SOFTWARE\Microsoft\Windows NT\CurrentVersion"
  GetHandle = RegOpenKeyEx_(stopKey, sKeyName, 0, #KEY_ALL_ACCESS, @hKey) 
  lpData.s=Space(1024)
  lpcbData=1024
  If GetHandle = #ERROR_SUCCESS 
    lType=#REG_SZ
    GetHandle = RegQueryValueEx_(hKey,Value, 0, @lType, @lpData, @lpcbData) 
    If Gethandle=0 And lpcbData>2
      RegCloseKey_(hkey) 
      ProcedureReturn Left(lpdata,lpcbData-1)
    EndIf
  Else 
    sKeyName.s = "SOFTWARE\Microsoft\Windows\CurrentVersion"
    GetHandle = RegOpenKeyEx_(stopKey, sKeyName, 0, #KEY_ALL_ACCESS, @hKey) 
    If GetHandle = #ERROR_SUCCESS 
      lType=#REG_SZ
      GetHandle = RegQueryValueEx_(hKey,Value, 0, @lType, @lpData, @lpcbData) 
      If Gethandle=0 And lpcbData>2
        RegCloseKey_(hkey) 
        ProcedureReturn Left(lpdata,lpcbData-1)
      EndIf
    EndIf
  EndIf   
EndProcedure

  INFO.s= GetOS_info("ProductName")
  toview.s=toview+#LF$ +info
  BuildLabEx.s=GetOS_info("BuildLabEx")
  If FindString(BuildLabEx,"amd64fre",1)
    toview=toview+#LF$ +"64 bit"
  EndIf
 MessageRequester("OS?", toview)
Grüsse
jpd
PB 5.10 Windows 7 x64
Antworten