坊间流传的代码都有些问题,比如不能正常获取win7以上的版本信息,不能获取诸如专业版,旗舰版等的信息,不能正常获取操作系统位的信息。
使用代码,写了一个简单的库来实现效果。用法大概如下:
对比一下坊间的几种不足: 总的来说。最大的问题就是不能正确检测你的操作系统到底是32位还是64位。几种方法大致如下: 1. 使用IntPtr指针的大小 最关键的一句代码是:
但是事实上,这个返回的不是操作系统的位数,返回的是运行的程序的位数,如果在64位的windows上以32位的模式运行了这个程序,那么就会返回32.
2. 使用PROCESSOR_ARCHITECTURE 环境变量
这就是纯粹的误导了,因为和1的情况一样。不能返回处理器的位数而是返回了运行程序的位数,如果在64位的windows上以32位的模式运行了这个程序,那么就会返回32.
3. 使用PInvoke 和 GetSystemInfo 注意:为了保持文章不要太长。。我没有包括PInvoke API的声明,(译者注:C#的互操作性嘛),但你可能在我提供的源代码里找到。
老问题,还是会返回运行程序的位数,而不是操作系统/处理器的位数。 4. 使用PInvoke和GetNativeSystemInfo 我看到过有人说上面的都不可信。可以使用GetNativeSystemInfo代替,代码和上面一样,只是把GetSystemInfo换成GetNativeSystemInfo就好。
结果不一样了。但是。。。这个API返回了处理器本身的位数,而我对操作系统的位数感兴趣。。毕竟64位的处理器上也可以轻松运行32位的操作系统 5. 组合 IntPtr.Size 和 IsWow64Process
如果IntPtr是64.操作系统必然也是64位,因为你不能在32位的操作系统上运行64位的程序 如果程序在32位模式下运行,代码会检测是否是64位的处理器,而程序在32位模式下运行来判断是32位还是64位。 如果返回的是64,那么操作系统是64位,但是程序以32位的模式运行,如果是32,那么操作系统也是32.
最后,我在lib里还加入了一些方法。以便区分程序/操作系统/处理器的位数。
源码下载:
[downloadicon href=http://pan.baidu.com/share/link?shareid=161028&uk=1493685990]OSVersion.zip[/downloadicon] 译自:http://www.codeproject.com/Articles/73000/Getting-Operating-System-Version-Info-Even-for-Win,有删减。