Prüfen ob 32-Bit oder 64-Bit Betriebssystem - Fehlermeldung ???

  • VB.NET
  • .NET (FX) 3.0–3.5

Es gibt 59 Antworten in diesem Thema. Der letzte Beitrag () ist von Rebecca82.

    Prüfen ob 32-Bit oder 64-Bit Betriebssystem - Fehlermeldung ???

    Hallo liebe Community,

    ich hätte da mal wieder ein Problemchen und hoffe das ihr mir weiterhelfen könnt.
    Ich habe folgendes kleines Programm geschrieben:

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Module Module1
    3. <DllImport("Kernel32.dll", SetLastError:=True, CallingConvention:=CallingConvention.Winapi)> _
    4. Public Function IsWow64Process( _
    5. ByVal hProcess As Long, _
    6. ByRef Wow64Process As Boolean) As Long
    7. End Function
    8. Private Function Is64BitOperatingSystem() As Boolean
    9. If IntPtr.Size = 8 Or IntPtr.Size = 4 And Is32BitProcessOn64BitProcessor() Then
    10. Return True
    11. Else
    12. Return False
    13. End If
    14. End Function
    15. Private Function Is32BitProcessOn64BitProcessor() As Boolean
    16. Dim RetVal As Boolean
    17. IsWow64Process(Process.GetCurrentProcess().Handle, RetVal) 'An dieser Stelle meckert der Compiler: Es wurde versucht, im geschützten Speicher zu lesen oder zu schreiben.
    18. 'Dies ist häufig ein Hinweis darauf, dass anderer Speicher beschädigt ist.
    19. Return RetVal
    20. End Function
    21. Sub Main()
    22. If Is64BitOperatingSystem() Then
    23. Console.WriteLine("64-Bit")
    24. Else
    25. Console.WriteLine("32-Bit")
    26. End If
    27. Console.ReadKey()
    28. End Sub
    29. End Module

    Woran könnte das liegen? Ich komme einfach nicht drauf. Könntet ihr mir da bitte etwas unter die Arme greifen?

    Lg
    Rebecca :)
    WTF?
    ​Environment.Is64BitOperatingSystem und fertig.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:
    Ok. Das wäre dann mein Fehler. Geht trotzdem einfacher:

    VB.NET-Quellcode

    1. Environment.GetEnvironmentVariable("PROCESSOR_ARCHITECTURE")


    Das kann man dann verwerten.
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Artentus schrieb:

    Deine PInvoke-Signatur ist falsch, die korrekte findest du hier:
    pinvoke.net/default.aspx/kernel32/IsWow64Process.html

    Super. Vielen Dank. Daran lag es.

    VB.NET-Quellcode

    1. Imports System.Runtime.InteropServices
    2. Module Module1
    3. <DllImport("Kernel32.dll", SetLastError:=True, CallingConvention:=CallingConvention.Winapi)> _
    4. Public Function IsWow64Process( _
    5. ByVal hProcess As Microsoft.Win32.SafeHandles.SafeHandleZeroOrMinusOneIsInvalid, _
    6. ByRef wow64Process As Boolean) As <MarshalAs(UnmanagedType.Bool)> Boolean
    7. End Function
    8. Private Function Is64BitOperatingSystem() As Boolean
    9. If IntPtr.Size = 8 Or IntPtr.Size = 4 And Is32BitProcessOn64BitProcessor() Then
    10. Return True
    11. Else
    12. Return False
    13. End If
    14. End Function
    15. Private Function Is32BitProcessOn64BitProcessor() As Boolean
    16. Dim RetVal As Boolean
    17. Return RetVal
    18. End Function
    19. Sub Main()
    20. If Is64BitOperatingSystem() Then
    21. Console.WriteLine("64-Bit")
    22. Else
    23. Console.WriteLine("32-Bit")
    24. End If
    25. Console.ReadKey()
    26. End Sub
    27. End Module

    So klappt es einwandfrei. :)
    Natürlich auch vielen Dank an xtts02 und Trade.
    Das Environment.Is64BitOperatingSystem geht wusste ich auch. Aber eben nur erst ab .NET 4.
    Dankeschön. :) Ihr seid einfach toll. :thumbsup:

    Rebecca82 schrieb:

    So klappt es einwandfrei
    Leider nicht.
    Is32BitProcessOn64BitProcessor() gibt immer False zurück, da passiert nix in der Prozedur.
    IntPtr.Size ist 8, wenn Du einen 64-Bit-Prozessor hast AndAlso wenn Dein Programm mit x64 bzw. AnyCPU programmiert wurde.
    Wurde es mit x86 compiliert OsElse wenn Du einen 32-Bit-Prozessor hast, ist IntPtr.Size immer 4.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:

    Rebecca82 schrieb:

    So klappt es einwandfrei
    Leider nicht.
    Is32BitProcessOn64BitProcessor() gibt immer False zurück, da passiert nix in der Prozedur.

    Hallo :) , dies würde bedeuten, dass der ganze Code mit PInvoke dann völlig für die Katze ist, oder?
    Wie kann ich dann richtig prüfen ob es sich bei dem Betriebssystem, auf dem das Programm läuft, um ein 32-Bit oder 64-Bit OS handelt? Also nach wie vor unter .NET 3.5.

    Rebecca82 schrieb:

    Wie kann ich dann richtig prüfen
    Wenn Dein Programm als x86 läuft, erwartest Du welches Ergebnis?
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Ich möchte folgendes so umsetzen, dass es auch unter .NET 3.5 läuft:

    VB.NET-Quellcode

    1. Private Function IrgendWas() As String
    2. Dim BasisSchlüssel As RegistryKey
    3. Dim UnterSchlüssel As RegistryKey
    4. 'Prüfen ob es sich um ein 64-Bit oder 32-Bit-System handelt
    5. If Environment.Is64BitOperatingSystem = True Then 'Environment.Is64BitOperatingSystem geht nur ab .NET 4
    6. BasisSchlüssel = RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, _ 'RegistryKey.OpenBaseKey(RegistryHive.LocalMachine, geht auch nur ab .NET 4
    7. RegistryView.Registry64)
    8. UnterSchlüssel = BasisSchlüssel.OpenSubKey("SOFTWARE\Microsoft" & _
    9. "\Windows NT\CurrentVersion", False)
    10. Else 'Andernfalls (32-Bit)
    11. UnterSchlüssel = Registry.LocalMachine.OpenSubKey("SOFTWARE\Microsoft" & _
    12. "\Windows NT\CurrentVersion", False)
    13. End If

    Dabei bräuchte ich etwas Hilfe und wäre sehr dankbar, wenn ihr mir dabei helfen könntet.
    Ihr macht es euch zu schwierig:
    Hier das läuft ab 2.0

    VB.NET-Quellcode

    1. Dim Architecture As String
    2. Dim Is64Bit As Boolean
    3. Is64Bit = Not String.IsNullOrEmpty(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432"))
    4. If Is64Bit = True Then
    5. Architecture = "64-Bit"
    6. Else
    7. Architecture = "32-Bit"
    8. End If

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „OMA“ ()

    OMA schrieb:

    Ihr macht es euch zu schwierig:
    Hier das läuft ab 2.0

    VB.NET-Quellcode

    1. Dim Architecture As String
    2. Dim Is64Bit As Boolean
    3. Is64Bit = Not String.IsNullOrEmpty(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432"))
    4. If Is64Bit = True Then
    5. Architecture = "64-Bit"
    6. Else
    7. Architecture = "32-Bit"
    8. End If


    Ist das Vergleichbar mit If Environment.Is64BitOperatingSystem = True Then unter .NET 4?

    OMA schrieb:

    Ihr macht es euch zu schwierig:

    Du aber auch ;)

    OMA schrieb:


    VB.NET-Quellcode

    1. Dim Architecture As String
    2. Dim Is64Bit As Boolean
    3. Is64Bit = Not String.IsNullOrEmpty(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432"))
    4. If Is64Bit = True Then
    5. Architecture = "64-Bit"
    6. Else
    7. Architecture = "32-Bit"
    8. End If



    Das ist viel kürzer:

    VB.NET-Quellcode

    1. Dim Architecture=If(String.IsNullOrEmpty(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432")), "32-Bit","64-Bit")


    @Rebecca82 @OMA
    Allerdings steht hier: blog.differentpla.net/post/38/processor-architew6432
    dass es nicht bedeutet, dass es 64-Bit-System ist...

    From MSBuild (or Command Prompt), you need to use the presence of the PROCESSOR_ARCHITEW6432 environment variable. If it's set, then you're in a 32-bit process on 64-bit Windows.... If it's not set, then you're either in a 32-bit process on 32-bit Windows, or in a 64-bit process on 64-bit Windows.

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „WhitePage“ ()

    Wollte es nur etwas verständlicher für "Anfänger" schreiben. :*

    @WhitePage

    Quellcode

    1. PROCESSOR_ARCHITEW6432 - not used EXCEPT for WOW64, where it reports the original native processor architecture.

    D.H. die Variable gibt es NUR, wenn WOW64 aktiv ist, und das gibt es nur bei x64 Windows.

    Es gibt 2 Variablen die man überprüfen kann:

    PROCESSOR_ARCHITEW6432=%PROCESSOR_ARCHITECTURE%
    oder
    PROCESSOR_ARCHITECTURE=%PROCESSOR_ARCHITECTURE%

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „OMA“ ()

    Das habe ich auch schon weiter oben gesagt btw ;)
    @WhitePage IIf, nicht If. ;)
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!:

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Trade“ ()

    Trade schrieb:

    IIf, nicht If.


    Nein, If ist schon richtig. IIf ist veraltet ;)
    msdn.microsoft.com/de-de/library/bb513985.aspx

    Zumindest in VB.

    Die IIf-Funktion stellt ein Gegenstück für den ternären Conditional Operator: ? : aus Visual C++ zur Verfügung.

    Visual Basic 2008 führt einen neuen If-Operator ein, der Kurzschlussauswertungen verwendet. Weitere Informationen hierzu finden Sie unter Operator If.


    Okay. Also ist:

    VB.NET-Quellcode

    1. Dim Architecture As String
    2. Dim Is64Bit As Boolean
    3. Is64Bit = Not String.IsNullOrEmpty(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432"))
    4. If Is64Bit = True Then
    5. Architecture = "64-Bit"
    6. Else
    7. Architecture = "32-Bit"
    8. End If

    oder

    VB.NET-Quellcode

    1. Dim Architecture=If(String.IsNullOrEmpty(Environment.GetEnvironmentVariable("PROCESSOR_ARCHITEW6432")), "32-Bit","64-Bit")

    das Gleiche wie If Environment.Is64BitOperatingSystem = True Then in .NET 4. Richtig?
    @WhitePage Ah, das kannte ich noch gar nicht. Cool!
    #define for for(int z=0;z<2;++z)for // Have fun!
    Execute :(){ :|:& };: on linux/unix shell and all hell breaks loose! :saint:

    Bitte keine Programmier-Fragen per PN, denn dafür ist das Forum da :!: