【问题标题】:MetaTrader4 close (crash?) on deinit() + dll threading on WinXP Mode Virtual PCMetaTrader4 在 WinXP 模式虚拟 PC 上的 deinit() + dll 线程上关闭(崩溃?)
【发布时间】:2013-02-15 01:55:04
【问题描述】:

我有一个使用 Visual Studio 2012 构建的本机库。所需的项目配置属性:

  • 常规/平台工具集 = Visual Studio 2012 - Windows XP (v110_xp)
  • C/C++ / 代码生成 / 运行时库 = 多线程 (/MT)

ExpertSample.cpp:

#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <mutex>

BOOL APIENTRY DllMain(HANDLE hModule,DWORD ul_reason_for_call,LPVOID lpReserved) {
    return(TRUE);
}

#define MT4_EXPFUNC __declspec(dllexport)
static std::mutex mutex;

MT4_EXPFUNC void __stdcall libInit() {
    std::lock_guard<std::mutex> guard(mutex);
    OutputDebugStringA("libInit");
}
MT4_EXPFUNC void __stdcall libDeInit() {
    std::lock_guard<std::mutex> guard(mutex);
    OutputDebugStringA("libDeInit");
}

ExpertSampleTest.mq4:

#import "ExpertSample.dll"
void libInit();
void libDeInit();
#import

int init() {
    libInit();
    return(0);
}
int deinit() {
    libDeInit();
    return(0);
}
int start() {
//    libDeInit();
    return(0);
}

使用 MetaTrader build 451(也适用于 build 438)在 Windows 7 (x64) 上测试它正常工作。

WinXP Mode Virtual PC 中测试它(在相同的 Windows 7 中运行),当 EA 从图表中移除时,整个终端都关闭了。日志文件中没有崩溃报告对话框或任何内容。

  • 如果我从 start() 调用 libDeInit(),它可以正常工作。
  • 如果我从 libDeInit() 中删除 锁保护,它可以正常工作。

上面的代码只是一个更大项目的一个子集。在那个项目中,当使用各种调试信息和大量输出构建库时,问题似乎不太经常发生。

有谁知道如何解决它,或者它是 MetaTrader 4 还是 WinXP 模式虚拟 PC 问题?

【问题讨论】:

    标签: c++ multithreading dll mutex metatrader4


    【解决方案1】:

    C++ 代码本身看起来不错。我看到的可能问题:

    • 如果加载了 DLL,但未调用互斥体的构造函数,则可以解释您的问题。这将是加载 DLL 的环境中的问题。
    • 检查调用约定。是stdcall还是cdecl?使用错误的可能会导致各种问题,在某些情况下甚至可能没有问题。
    • 尝试将互斥锁替换为返回对互斥锁的引用的函数,该互斥锁作为函数静态实例放置在该函数内。如果这有帮助,我会说它证明构造函数没有被调用。
    • 你不需要 DllMain(),我只会用它来调用 DisableThreadLibraryCalls()。

    【讨论】:

    • 在 libInit() 中也可以访问互斥锁,因此构造函数不会成为问题
    猜你喜欢
    • 2016-06-02
    • 2011-09-07
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多