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; }
关键修正点
- 类型匹配:将
wProcessorArchitecture、wReserved、wProcessorLevel、wProcessorRevision改为ushort(对应Windows的WORD类型,16位),原代码的uint/ulong会导致内存偏移错位。 - 移除无效的
dwOemId:原生结构体中dwOemId是联合体成员,与wProcessorArchitecture+wReserved内存重叠,直接定义这两个16位成员更准确,避免MQL5对联合体的兼容问题。 - 内存对齐:确保所有成员的类型大小与Windows原生结构体一致,保证
GetNativeSystemInfo写入内存时每个字段都对应正确的偏移位置。
运行修正后的代码,就能得到MSDN文档中预期的处理器架构数值。
内容的提问来源于stack exchange,提问作者ali ansyy
相关产品推荐
相关产品推荐

