2010-08-26 18 views
5

मैंने कोशिश की:यह निर्धारित करने के लिए कि कोई सिस्टम। डायग्नोस्टिक्स.प्रोसेस 32 या 64 बिट है या नहीं?

process.MainModule.FileName.Contains("x86") 

लेकिन यह एक 64 प्रक्रिया के लिए एक अपवाद दिए:

Win32Exception: ReadProcessMemory कहां WriteProcessMemory अनुरोध का केवल एक हिस्सा समाप्त हो गया

+1

आप गलत सवाल पूछ रहे हैं। असली सवाल होना चाहिए: "मैंने रीडप्रोसेस मेमरी कॉल को कैसे खराब किया?" –

+1

@ हंस मुझे इस कॉल के बारे में बिल्कुल परवाह नहीं है जब तक कि प्रश्न शीर्षक का उत्तर दिया जाए। मैंने जो समस्या सूचीबद्ध की है वह शीर्षक का जवाब देने का एक तरीका है। –

+0

संभावित डुप्लिकेट [प्रक्रिया को कैसे जानें 32-बिट या 64-बिट प्रोग्रामेटिक रूप से] [http://stackoverflow.com/questions/1953377/how-to-now-a-process-is-32-bit-or -64-बिट-प्रोग्रामेटिक रूप से) –

उत्तर

8

आप पी/आह्वान के माध्यम से IsWow64Process कॉल करने की आवश्यकता:

[DllImport("kernel32.dll", SetLastError = true, CallingConvention = CallingConvention.Winapi)] 
[return: MarshalAs(UnmanagedType.Bool)] 
public static extern bool IsWow64Process([In] IntPtr processHandle, [Out, MarshalAs(UnmanagedType.Bool)] out bool wow64Process); 

यहाँ यह थोड़ा आसान कॉल करने के लिए बनाने के लिए एक सहायक है:

public static bool Is64BitProcess(this Process process) 
{ 
    if (!Environment.Is64BitOperatingSystem) 
     return false; 

    bool isWow64Process; 
    if (!IsWow64Process(process.Handle, out isWow64Process)) 
     throw new Win32Exception(Marshal.GetLastWin32Error()); 

    return !isWow64Process; 
} 
+1

यह विधि 32-बिट Windows –

+1

में विफल हो जाएगी 32-बिट विंडोज़ पर सभी प्रक्रियाएं 32-बिट हैं, इसलिए जांच करने की कोई आवश्यकता नहीं है। मैंने इसे प्रतिबिंबित करने के लिए Is64BitProcess संपादित किया है। –

+0

जीसी सफाई प्रक्रिया को रोकने के लिए प्रक्रिया.SafeHandle संपत्ति का उपयोग करें। WinAPI कहा जाता है जबकि हैंडल। –

1

न तो WMI के Win32_Process या System.Diagnostics.Process कोई स्पष्ट संपत्ति प्रदान करते हैं।

कैसे लोड मॉड्यूल (Process.Modules) के माध्यम से पुनरावृत्ति के बारे में, एक 32 बिट प्रक्रिया %WinDir%\syswow64\kernel32.dll लोड किया जाएगा, जबकि एक 64 बिट प्रक्रिया %WinDir%\system32\kernel32.dll से भरी हुई है जाएगा (यह एक dll है कि हर विंडोज प्रक्रिया लोड होता है)।

एनबी। यह परीक्षण, निश्चित रूप से, एक x86 ओएस उदाहरण पर असफल होगा।

0

Environment.Is64BitProcess शायद आप जो खोज रहे हैं वह शायद है।

+2

यह केवल आपको बताता है कि कॉलिंग प्रक्रिया 64-बिट है, मुझे लगता है कि ओपी जानना चाहता है कि क्या एक और प्रक्रिया 64-बिट –

+0

@ फिल: हाँ, मुझे यकीन नहीं था कि ओपी का इरादा क्या था। मुझे लगता है कि वह डाउनवोट या टिप्पणी कर सकता है। –

+0

इस विधि को आपने इंगित किया है .NET Fx –

संबंधित मुद्दे