在Cygwin环境下用C语言获取Windows系统版本的方法
获取Cygwin环境下的Windows系统版本
方法1:直接调用Windows原生API
Cygwin的GCC允许直接调用Windows系统函数,无需安装微软开发工具。推荐使用RtlGetVersion(替代已废弃的GetVersionEx),它能准确获取Windows版本信息。
示例代码:
#include <stdio.h> #include <windows.h> typedef NTSTATUS(WINAPI* RtlGetVersionPtr)(PRTL_OSVERSIONINFOW); int main() { RTL_OSVERSIONINFOW osvi; osvi.dwOSVersionInfoSize = sizeof(osvi); // 动态加载ntdll.dll并获取RtlGetVersion函数地址 HMODULE hNtdll = LoadLibraryW(L"ntdll.dll"); if (!hNtdll) { fprintf(stderr, "Failed to load ntdll.dll\n"); return 1; } RtlGetVersionPtr pRtlGetVersion = (RtlGetVersionPtr)GetProcAddress(hNtdll, "RtlGetVersion"); if (!pRtlGetVersion) { fprintf(stderr, "Failed to get RtlGetVersion address\n"); FreeLibrary(hNtdll); return 1; } NTSTATUS status = pRtlGetVersion(&osvi); if (status >= 0) { printf("Windows Version: %d.%d Build %d\n", osvi.dwMajorVersion, osvi.dwMinorVersion, osvi.dwBuildNumber); } else { fprintf(stderr, "Failed to get version info\n"); } FreeLibrary(hNtdll); return 0; }
编译命令:gcc -o winversion winversion.c -lkernel32
说明:
- 返回的版本号对应关系:
- Windows 10/11: 10.0
- Windows 8.1: 6.3
- Windows 8: 6.2
- Windows 7: 6.1
- Windows Vista: 6.0
方法2:读取Cygwin的/proc/version文件
Cygwin模拟了Unix的proc文件系统,/proc/version文件中包含Windows系统版本信息,无需调用API,直接读取即可。
示例代码:
#include <stdio.h> #include <string.h> int main() { FILE* fp = fopen("/proc/version", "r"); if (!fp) { fprintf(stderr, "Failed to open /proc/version\n"); return 1; } char line[256]; while (fgets(line, sizeof(line), fp)) { char* win_ver = strstr(line, "Windows"); if (win_ver) { printf("Windows Version: %s", win_ver); break; } } fclose(fp); return 0; }
编译命令:gcc -o readversion readversion.c
说明:
/proc/version的内容格式类似CYGWIN_NT-10.0-WOW64 3.4.6(0.341/5/3) 2023-02-14 13:24 x86_64 Cygwin,其中NT-10.0对应Windows 10/11。
方法3:使用Cygwin内置的版本函数
Cygwin提供了cygwin_version函数,可直接获取其检测到的Windows版本号,代码最简洁。
示例代码:
#include <stdio.h> #include <cygwin/version.h> int main() { const cygwin_version_info_struct* info = cygwin_version(); printf("Windows Version (Cygwin reported): %d.%d\n", info->win_major, info->win_minor); return 0; }
编译命令:gcc -o cygwinver cygwinver.c
内容的提问来源于stack exchange,提问作者s_question
相关产品推荐
相关产品推荐

