MQL5已将ZMQL.dll放入Libraries目录仍无法加载的技术求助
MT5加载自定义ZMQL.dll失败的排查与解决
问题描述
开发了基于ZMQ的ZMQL.dll,已放入MT5的MQL5/Libraries目录,EA编译正常,但运行调试器时提示“Unknown error”,策略测试时出现错误126,无法加载DLL,进而无法调用init_zmq函数。
相关代码与环境信息
1. DLL头文件定义
#pragma once #ifdef _WIN32 #ifdef ZMQL_EXPORTS #define ZMQL_EXPORT extern "C" __declspec(dllexport) #else #define ZMQL_EXPORT extern "C" __declspec(dllimport) #endif #define ZMQL_CALL __stdcall #else #define ZMQL_EXPORT extern "C" #define ZMQL_CALL #endif #include <stddef.h> // Function declarations ZMQL_EXPORT int ZMQL_CALL init_zmq(wchar_t* endpoint);
2. DLL放置路径
Directory: C:\Users\user\AppData\Roaming\MetaQuotes\Terminal\D0E8209F77C8CF37AD8BF550E51FF075\MQL5\Libraries Mode LastWriteTime Length Name ---- ------------- ------ ---- -a---- 5/19/2025 1:18 PM 36352 ZMQL.dll
3. MQL5 EA代码
#import "ZMQL.dll" int init_zmq(string endpoint); int zmq_publish(string topic, string message); void destroy_zmq(); #import input string Endpoint = "tcp://127.0.0.1:5555"; // Default ZMQ endpoint input string Topic = "TOPIC2"; // Default topic //+------------------------------------------------------------------+ //| Expert initialization function | //+------------------------------------------------------------------+ int OnInit() { //--- Print("---------------Init...----------"); int init_result = init_zmq(Endpoint); //if (init_result != 0) { // Print("Failed to initialize ZMQ! Error: ", init_result); //return(INIT_FAILED); //} Print("ZMQ initialized successfully."); //--- return(INIT_SUCCEEDED); }
4. 策略测试核心错误日志
2025.05.19 13:49:44.503 2025.04.30 00:00:00 cannot load 'C:\Users\user\AppData\Roaming\MetaQuotes\Tester\D0E8209F77C8CF37AD8BF550E51FF075\Agent-127.0.0.1-3000\MQL5\Experts\Advisors\Tests\ZMQL\ZMQL.dll' [126] 2025.05.19 13:49:44.503 2025.04.30 00:00:00 cannot call 'int ZMQL::init_zmq(string)', module 'ZMQL.dll' is not loaded 2025.05.19 13:49:44.503 OnInit critical error
已知前提
- MT5已开启允许使用DLL的权限
- DLL采用VCPKG三元组
x64-windows-static-md编译
排查与解决步骤
1. 确认架构匹配
MT5是64位应用,必须确保ZMQL.dll为x64架构:
- 使用
dumpbin工具检查:执行dumpbin /headers ZMQL.dll,查看输出中Machine字段是否为x64 (AMD64)。
2. 排查依赖库缺失
错误126通常表示DLL依赖的其他库未找到:
- 用Dependencies工具扫描ZMQL.dll,检查是否有缺失的系统库或第三方依赖。
- 若存在缺失的依赖库,将其复制到MT5的
MQL5/Libraries目录;若依赖是ZMQ相关组件,确保编译时已静态链接到DLL中。
3. 修正函数调用约定与参数类型
- 调用约定匹配:DLL中函数使用
__stdcall,EA导入时需显式声明:#import "ZMQL.dll" int init_zmq(string endpoint) __stdcall; int zmq_publish(string topic, string message) __stdcall; void destroy_zmq() __stdcall; #import - 参数类型匹配:DLL中
init_zmq接收wchar_t*(宽字符),而MQL5的string默认是ANSI编码,需转换为宽字符后再调用:int OnInit() { Print("---------------Init...----------"); wchar_t w_endpoint[256]; StringToWideChar(Endpoint, w_endpoint, 256); int init_result = init_zmq(w_endpoint); Print("ZMQ initialized successfully."); return(INIT_SUCCEEDED); }
4. 验证DLL部署路径
策略测试器会将文件复制到独立的测试目录,可手动将ZMQL.dll复制到日志中报错的路径(Agent-xxx下的Experts子目录),测试是否能正常加载。
5. 调整编译选项
尝试将VCPKG三元组改为x64-windows-static(静态链接运行时库)重新编译DLL,避免MT5运行时库版本不兼容问题。
内容的提问来源于stack exchange,提问作者Fares
相关产品推荐
相关产品推荐

