在WinXP Mode Virtual PC上的deinit()+ dll线程上,MetaTrader4关闭(崩溃?)

时间:2013-02-15 01:55:05

标签: c++ multithreading dll mutex metatrader4

我有一个使用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内部版本451(也适用于版本438)在Windows 7(x64)上进行测试正常工作。

WinXP模式虚拟PC (在同一Windows 7中运行)中进行测试,当从图表中删除EA时,整个终端将关闭。没有崩溃报告对话框,也没有日志文件中的任何内容。

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

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

有人知道如何修复它,或者它是MetaTrader 4还是WinXP Mode Virtual PC问题?

1 个答案:

答案 0 :(得分:0)

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

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