2013-02-15 101 views
0

我有一个本地库建立与Visual Studio 2012年所需的项目配置属性:的MetaTrader4关闭(崩溃?)

  • 一般/平台工具集=的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); 
} 

测试它在Windows 7(64位)与MetaTrader的建立451(也可用于构建438)正常工作。

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

  • 如果我从start()调用libDeInit()它工作正常。
  • 如果我从libDeInit()中删除锁守卫,它工作正常。

上述代码只是大型项目的子集。在那个项目中,当图书馆建立了各种调试信息和大量输出时,问题似乎不太经常发生。

有人知道如何解决它,或者它是否是MetaTrader 4或WinXP Mode Virtual PC问题?

回答

0

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

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

在libInit()中也可以访问互斥锁,所以构造函数不能成为问题 – Ogmios 2013-02-27 13:57:34