我有一个使用 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);
}
在 Windows 7 (x64) 上使用 MetaTrader build 451(也适用于 build 438)对其进行测试正常工作。
在WinXP Mode Virtual PC(在相同的 Windows 7 中运行)中对其进行测试,当 EA 从图表中移除时,整个终端将关闭。日志文件中没有崩溃报告对话框或任何内容。
- 如果我从 start() 调用 libDeInit() 它工作正常。
- 如果我从 libDeInit()中移除锁保护,它工作正常。
上面的代码只是一个更大项目的一个子集。在那个项目中,当使用各种调试信息和大量输出构建库时,问题似乎不太经常发生。
有谁知道如何修复它,或者它是 MetaTrader 4 还是 WinXP 模式虚拟 PC 问题?