0

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 の問題なのか?

4

1 に答える 1

0

C++ コード自体は良さそうです。考えられる問題:

  • DLL がロードされているが、ミューテックスのコンストラクターが呼び出されていない場合は、問題が説明されます。これは、DLL をロードする環境では問題になります。
  • 呼び出し規約を確認してください。それは stdcall または cdecl ですか? 間違ったものを使用すると、あらゆる種類の問題が発生する可能性があり、状況によっては問題が発生しないこともあります。
  • ミューテックスを、その関数内に関数静的インスタンスとして配置されているミューテックスへの参照を返す関数に置き換えてみてください。それが役に立ったら、コンストラクターが呼び出されていないことを証明していると思います。
  • DllMain() は必要ありません。DisableThreadLibraryCalls() を呼び出すためだけに使用します。
于 2013-02-17T00:39:48.780 に答える