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

是否存在可获取DLL文件架构信息的Win32函数?

DLL架构检测实现方法

首先纠正一个常见误区:GetBinaryType() 并非只能检测EXE文件,传入DLL路径同样可以返回架构结果:

  • 返回SCS_32BIT_BINARY 对应32位x86二进制
  • 返回SCS_64BIT_BINARY 对应64位x64二进制
  • 其余返回值可对应IA64、ARM、ARM64等其他架构
    注意:该API对ARM、ARM64架构的识别支持从Windows 10 1607版本才开始加入,如果需要兼容更早的Windows版本,或者需要更精准的架构判定,直接解析PE文件头是兼容性最好、最可靠的方案,全程不需要加载DLL,完全可以在调用LoadLibrary()前完成校验。

手动解析PE头检测方案(推荐)

PE格式是Windows下EXE/DLL统一的可执行文件格式,直接读文件头判断不会触发DLL加载,也不存在系统版本兼容问题,步骤如下:

  1. 调用CreateFile()以只读权限打开目标DLL文件
  2. 读取IMAGE_DOS_HEADER结构,校验e_magic字段值是否为0x5A4D(即"MZ"标识),不匹配则不是合法的Windows可执行文件
  3. 移动文件指针到e_lfanew字段存储的偏移位置,读取NT头签名,校验是否为0x00004550(即"PE\0\0"标识),不匹配则文件损坏或不是合法PE
  4. 紧接NT签名后的结构为IMAGE_FILE_HEADER,读取其中的Machine字段,根据字段值直接判定架构:
    • 0x014c:x86 32位架构
    • 0x8664:x64(AMD64/Intel64)64位架构
    • 0x01c0:ARM 32位架构
    • 0xaa64:ARM64 64位架构
    • 0x0200:Itanium(IA64)64位架构
  5. 校验完成后关闭文件句柄即可,整个过程不会加载DLL到进程内存,也不会执行DLL的任何代码,不存在架构不匹配导致的加载错误。

不建议使用LoadLibraryEx配合LOAD_LIBRARY_AS_DATAFILE等标志加载DLL后再读取信息,这种方式依然可能因为DLL依赖缺失、权限不足等问题加载失败,远不如直接读取原始文件头稳定。

内容的提问来源于stack exchange,提问作者Ryan Glenn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.03 07:12:34