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 モードの仮想 PC の問題なのか?