首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MetaTrader4关闭(崩溃?)WinXP模式虚拟PC上的deinit() + dll线程

MetaTrader4关闭(崩溃?)WinXP模式虚拟PC上的deinit() + dll线程
EN

Stack Overflow用户
提问于 2013-02-15 01:55:04
回答 1查看 577关注 0票数 0

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

  • 通用/平台工具集=VisualStudio2012-WindowsXP (v110_xp)
  • C/C++ /代码生成/运行时库=多线程(/MT)

ExpertSample.cpp:

代码语言:javascript
复制
#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:

代码语言:javascript
复制
#import "ExpertSample.dll"
void libInit();
void libDeInit();
#import

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

在Windows7 (x64)上使用MetaTrader build 451 (也适用于build 438)进行测试,正常工作。

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

  • 如果我从start()开始调用libDeInit(),它就能正常工作。
  • 如果我将锁保护从libDeInit()中删除,它就能正常工作。

上面的代码只是大型项目的一个子集。在这个项目中,当库是用各种各样的调试信息和大量的输出构建时,这个问题似乎很少发生。

有没有人知道如何修复它,或者它是MetaTrader 4还是WinXP模式虚拟PC问题?

EN

回答 1

Stack Overflow用户

发布于 2013-02-17 00:39:48

C++代码本身看起来不错。我认为可能存在的问题:

  • 如果加载了DLL,但没有调用互斥对象的构造函数,这将解释您的问题。这将是加载DLL的环境中的一个问题。
  • 查一下电话会议。是stdcall还是cdecl?错误的使用会导致各种问题,甚至在某些情况下甚至没有问题。
  • 尝试用返回对互斥对象的引用的函数替换互斥对象,该互斥对象在该函数中作为函数静态实例放置。如果这有帮助的话,我会说它证明了构造函数没有被调用。
  • 您不需要DllMain(),我只使用它来调用DisableThreadLibraryCalls()。
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14887263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档