MetaTrader4 закрывается (сбой?) На deinit () + dll-потоки на WinXP Mode Virtual PC

У меня есть собственная библиотека, созданная с помощью 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), когда советник удаляется с графика, весь терминал закрывается. В файлах журнала нет диалогового окна с отчетом о сбое или чего-либо еще.

  • Если я вызываю libDeInit () из start (), он работает нормально.
  • Если я удалю замок охранник из libDeInit () работает нормально.

Приведенный выше код является лишь частью большого проекта. В этом проекте, когда библиотека была построена со всеми видами отладочной информации и большим количеством выходных данных, проблема, казалось, возникала реже.

Кто-нибудь знает, как это исправить, или это проблема MetaTrader 4 или WinXP Mode Virtual PC?

0

Решение

Сам код C ++ выглядит хорошо. Возможные проблемы, которые я вижу:

  • Если DLL загружена, но конструктор мьютекса не вызывается, это объяснит вашу проблему. Это было бы проблемой в среде загрузки DLL.
  • Проверьте соглашение о вызовах. Это stdcall или cdecl? Использование неправильного может вызвать всевозможные проблемы, возможно, даже не возникнет проблем при некоторых обстоятельствах.
  • Попробуйте заменить мьютекс на функцию, возвращающую ссылку на мьютекс, который помещается как статический экземпляр функции внутри этой функции. Если это поможет, я бы сказал, что это доказывает, что конструктор не вызывается.
  • Вам не нужен DllMain (), я бы использовал его только для вызова DisableThreadLibraryCalls ().
0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]