我遇到了一个小问题:
我想了解操作系统的架构,问题是我的编程语言不支持此类功能。因此我需要从 Windows DLL(如 kernel32.dll)读取此信息
我确实尝试使用函数 GetNativeSystemInfo/GetVersionEx/GetSystemInfo
获取信息。
不幸的是我无法获得架构:/
还有其他一些函数可以读取 Windows dll 中的架构吗?
(不需要是kernel32,可以是任何dll,但必须存在于win xp+中)
作为信息:我使用 Gupta(SQLWindows/Team devoloper)
编辑1:
typedef struct _SYSTEM_INFO {
union {
DWORD dwOemId;
struct {
WORD wProcessorArchitecture;
WORD wReserved;
} ;
} ;
DWORD dwPageSize;
LPVOID lpMinimumApplicationAddress;
LPVOID lpMaximumApplicationAddress;
DWORD_PTR dwActiveProcessorMask;
DWORD dwNumberOfProcessors;
DWORD dwProcessorType;
DWORD dwAllocationGranularity;
WORD wProcessorLevel;
WORD wProcessorRevision;
} SYSTEM_INFO;
这就是 MSDN 的信息,我尝试使用 10 和 12 个参数调用此函数
(Gupta 不支持结构)。
在 32 位上我得到:
alt text http://img714.imageshack.us/img714/1954/32bit.gif
在 64 位上我得到:
alt text http://img691.imageshack.us/img691/8978/64bit.gif
在 32 位上我每次都会得到 0
OemID 吗?或者更好的是在 64 位版本的 Windows 上填写 OemID everytiem?
谢谢帮助!!
问候
奥罗
最佳答案
GetNativeSystemInfo
肯定是要使用的功能。如果您的应用程序是 native 64 位应用程序,GetNativeSystemInfo
与 GetSystemInfo
相同;否则,如果它在WOW64下运行,它将返回真实的系统属性,即使它是在模拟的32位环境中运行。
GetNativeSystemInfo
填写 SYSTEM_INFO
结构,wProcessorArchitecture
其中的成员告诉您系统是 32 位(可能是 PROCESSOR_ARCHITECTURE_INTEL
)还是 64 位(可能是 PROCESSOR_ARCHITECTURE_AMD64
)。
如果您的语言没有此 Win API 函数的包装器,要使用它,您可以使用 LoadLibrary
和GetProcAddress
像往常一样,您需要定义 SYSTEM_INFO
当然是结构。
更新
我会定义
typedef struct _SYSTEM_INFO {
WORD wProcessorArchitecture;
WORD wReserved;
DWORD dwPageSize;
LPVOID lpMinimumApplicationAddress;
LPVOID lpMaximumApplicationAddress;
DWORD_PTR dwActiveProcessorMask;
DWORD dwNumberOfProcessors;
DWORD dwProcessorType;
DWORD dwAllocationGranularity;
WORD wProcessorLevel;
WORD wProcessorRevision;
} SYSTEM_INFO;
然后wProcessorArchitecture = 0
在(通用)32 位系统上,以及 wProcessorArchitecture = 9
在(通用)64 位系统上。这些只是常数PROCESSOR_ARCHITECTURE_INTEL
和PROCESSOR_ARCHITECTURE_AMD64
, 分别。这些是常见的 32 位和 64 位架构。 PROCESSOR_ARCHITECTURE_IA64 = 6
稍微不常见,肯定是 PROCESSOR_ARCHITECTURE_UNKNOWN = 65535
.
更新
是的,我看到你的问题了。在C中,union
意味着您一次选择一个选项。也就是说,结构是:
DWORD dwOemId;
DWORD dwPageSize;
LPVOID lpMinimumApplicationAddress;
LPVOID lpMaximumApplicationAddress;
DWORD_PTR dwActiveProcessorMask;
DWORD dwNumberOfProcessors;
DWORD dwProcessorType;
DWORD dwAllocationGranularity;
WORD wProcessorLevel;
WORD wProcessorRevision;
或
WORD wProcessorArchitecture;
WORD wReserved;
DWORD dwPageSize;
LPVOID lpMinimumApplicationAddress;
LPVOID lpMaximumApplicationAddress;
DWORD_PTR dwActiveProcessorMask;
DWORD dwNumberOfProcessors;
DWORD dwProcessorType;
DWORD dwAllocationGranularity;
WORD wProcessorLevel;
WORD wProcessorRevision;
由于一个 DWORD 由两个字 (2×2) 一样多的字节 (4) 组成,因此替代方案只是对整个结构的数据进行寻址(和命名)的两种方式。在我们的例子中,我们对 wProcessorArchitecture
更感兴趣单词而不是增强dwOemId
的wProcessorArchitecture
和完全无趣的wReserved
话。
关于windows - 获取Windows体系结构(32/64位版本),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3179916/