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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 02:44:51