如何从 VB 6 应用程序确定 Windows 版本?
我想检测从 95 到 Win 7 的任何 Windows 版本。
我还想显示操作系统是 32 位还是 64 位。
就是这样;就是这么简单。 :) 我可以使用什么代码在 VB 6 应用程序中执行此操作?
I want to detect any Windows versions from 95 to Win 7.
I also would like to display if the OS is 32-bit or 64-bit.
That's it; it's that simple. :) What code could I use to do this from within a VB 6 application?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
。以下代码将返回一个指示 Windows 当前版本的字符串值基本上,它所做的就是使用
GetVersionEx
API 函数,然后将它们与已知的 Windows 版本进行匹配。(请注意,某些例如,64 位版本的 Windows XP 可能会被报告为 Server 2003。例如,还没有编写确定用户运行的是 Windows Vista 还是 Server 2008 的代码。可以根据需要进行调整。)
此外,如果您不需要以最早版本的 Windows 为目标,则可以通过传递
OSVERSIONINFOEX
结构 代替。我刚刚用 C++ 编写了该代码,并且文档非常容易理解。从 VB 6 可执行文件确定主机操作系统是 32 位还是 64 位有点棘手。原因是VB 6无法编译64位应用程序。您在 VB 6 中编写的所有内容都将作为 32 位应用程序运行。 32 位应用程序在 Windows-on-Windows (WOW64) 子系统中的 64 位版本 Windows 上运行。他们总是将当前版本的 Windows 报告为 32 位,因为这就是他们所看到的。
我们可以通过最初假设主机操作系统是 32 位并尝试证明这是错误的来解决这个问题。这是一些示例代码:
The following code will return a string value indicating the current version of Windows. Basically, all it's doing is getting the system version numbers from Windows using the
GetVersionEx
API function, and then matching those up to the known versions of Windows.(Note that some things are not detected perfectly. For example, a 64-bit version of Windows XP would likely be reported as Server 2003. Code to determine whether the user is running Windows Vista or Server 2008, for example, has also not been written. But you can take this and tweak it as desired.)
Additionally, if you don't need to target the earliest versions of Windows, you can get more information by passing the
OSVERSIONINFOEX
structure instead. I just wrote that code in C++, and the documentation is surprisingly easy to follow.Determining if the host OS is 32-bit or 64-bit from a VB 6 executable is a little trickier. The reason is because VB 6 can't compile 64-bit applications. Everything you write in VB 6 will run as a 32-bit application. And 32-bit applications run on 64-bit versions of Windows in the Windows-on-Windows (WOW64) subsystem. They will always report the current version of Windows as 32-bit, because that's what they see.
We can work around this by initially assuming that the host OS is 32-bit, and attempting to prove this wrong. Here's some sample code:
还有操作系统的 WMI 任务。
您可以执行与上面 Cody Gray 提供的 case 语句类似的操作来解析
Version
值,或解析纯文本Caption
值,其中包含诸如Microsoft 之类的列表(R) Windows(R) Server 2003 标准版
和Microsoft Windows 7 Professional
。There's also the WMI Tasks for Operating Systems.
You can do something similar to the case statements provided by Cody Gray above to parse the
Version
value, or parse the plain textCaption
value, which has listings likeMicrosoft(R) Windows(R) Server 2003, Standard Edition
andMicrosoft Windows 7 Professional
.您可以尝试使用 Microsoft Sysinfo 控件附带 VB6 并检查 OSPlatform、OSBuild 和 OSVersion 属性以与正确的 操作系统版本#
You could try using the Microsoft Sysinfo control that comes with VB6 and check for OSPlatform, OSBuild and OSVersion propertys to match with the proper OS Version #
接受的答案适用于我的应用程序,直到我在 Windows 10 上尝试它。即使在更新版本号详细信息的代码之后 如此处列出,它报告了错误的 Windows 版本。事实证明这是因为:
因此,为了显示正确的 Windows 版本,相当于在应用程序清单中添加一个部分:
然后 GetVersionInfo API 按预期工作。我相信这个清单部分是从 Windows 7 开始新增的。
但是,一个非常重要的警告是,您必须实际在您列出的与其兼容的每个操作系统版本上测试您的应用程序。这些设置影响某些 Windows 功能,而不仅仅是报告 Windows 版本信息的方式。
The accepted answer worked for my application until I tried it on Windows 10. Even after updating the code for version number details as listed here it reported the wrong Windows version. It turns out this is because:
So in order to get the correct Windows version to show up, it amounts to adding a section the application manifest:
And then the GetVersionInfo API works as expected. This manifest section was new as of Windows 7, I believe.
However, a very important caveat is that you must actually have tested your application on each operating system version that you list it as being compatible with. These settings affect certain Windows functions, not only the way Windows version information is reported.
这是我用来确定 32 位与 64 位操作系统的一个非常简单的方法:
在 64 位 Windows 中,操作系统设置环境变量“PROGRAMFILES(X86)”,但在 32 位系统上则不会。它还没有让我失望...
Here is a very simple method I use to determine 32 vs. 64 bit operating system:
In 64-bit Windows, the OS sets the environment variable "PROGRAMFILES(X86)" but it doesn't on 32-bit systems. It hasn't failed me yet...
啊,找到了!我个人并不使用这个类,因为对于我的需要来说它有点过分了,但它绝对是我遇到过的最彻底的 OpSys 版本示例。这要归功于肯尼思·艾夫斯。
*我猜 StackOverflow 不喜欢大量的代码块,因此类 (clsOperSystem.cls) 位于 KiCrypt Demo,哈希和加密算法的优秀汇编。
Ah, found it! I don't personally use this class because for my needs it's overkill, but it's definitely the most thorough OpSys version example I've come across. Credit for this one goes to Kenneth Ives.
*I guess StackOverflow doesn't like enormous blocks of code, so the class (clsOperSystem.cls) is located in the KiCrypt Demo, an excellent compilation of hash and encryption algorithms.
在 WINDOWS 10 上工作
VB6 - 不能在调试模式下工作 - 仅在运行时调用
WORK on WINDOWS 10
VB6 - not work in debug mode - work only on runtime
call