You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MQL5调用GetNativeSystemInfo获取处理器架构异常求助

解决MQL5调用GetNativeSystemInfo获取处理器架构错误的问题

你的问题核心是MQL5中定义的_SYSTEM_INFO结构体与Windows API原生的结构体内存布局不匹配,导致参数偏移错误,返回了非预期值。以下是具体修正方案:

问题分析

Windows原生_SYSTEM_INFO结构体的第一个成员是联合体,且内部多个字段为16位的WORD类型,但你在MQL5中错误地使用了32位uint和64位ulong来定义,直接破坏了内存对齐和成员偏移,最终读取到错误的内存值(4096就是错位后的无效数据)。

修正后的代码

// 严格对应Windows API的_SYSTEM_INFO内存布局和类型
struct _SYSTEM_INFO
{
   ushort            wProcessorArchitecture;  // 对应WORD类型,16位
   ushort            wReserved;               // 对应WORD类型,16位
   uint              dwPageSize;              // 对应DWORD类型,32位
   ulong             lpMinimumApplicationAddress; // 对应LPVOID,64位(MQL5是64位环境)
   ulong             lpMaximumApplicationAddress;
   ulong             dwActiveProcessorMask;   // 对应DWORD_PTR,64位
   uint              dwNumberOfProcessors;
   uint              dwProcessorType;
   uint              dwAllocationGranularity;
   ushort            wProcessorLevel;         // 对应WORD类型,16位
   ushort            wProcessorRevision;      // 对应WORD类型,16位
};

#import "kernel32.dll"
void GetNativeSystemInfo(_SYSTEM_INFO &lpSystemInfo);
#import

int OnInit()
{
   _SYSTEM_INFO hos;
   GetNativeSystemInfo(hos);
   // 输出正确的处理器架构值,对应MSDN定义:0=x86,9=x64,5=ARM,6=ARM64等
   Alert("处理器架构值: ", hos.wProcessorArchitecture);
   return INIT_SUCCEEDED;
}

关键修正点

  1. 类型匹配:将wProcessorArchitecture、wReserved、wProcessorLevel、wProcessorRevision改为ushort(对应Windows的WORD类型,16位),原代码的uint/ulong会导致内存偏移错位。
  2. 移除无效的dwOemId:原生结构体中dwOemId是联合体成员,与wProcessorArchitecture+wReserved内存重叠,直接定义这两个16位成员更准确,避免MQL5对联合体的兼容问题。
  3. 内存对齐:确保所有成员的类型大小与Windows原生结构体一致,保证GetNativeSystemInfo写入内存时每个字段都对应正确的偏移位置。

运行修正后的代码,就能得到MSDN文档中预期的处理器架构数值。

内容的提问来源于stack exchange,提问作者ali ansyy

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 03:35:17