1

これは少なくとも Windows XP の wxWidgets 2.8.9 と 2.8.10 で発生し、他のプラットフォームではテストしていません:

ホスト シーケンサーで実行される VST プラグインである a.dll と b.dll の 2 つの dll があります。wxWidgets と OpenGL を利用します。初期化時に、両方のプラグインでこれを呼び出します (ただし、m_width と m_height は異なります)。

MyControl(..)
{
    ..
    m_canvas = new wxGLCanvas(this, wxID_ANY, 0, wxPoint(0, 0), wxSize(m_width, m_height));
    m_context = new wxGLContext(m_canvas);
    ..
    m_canvas->SetCurrent(*m_context);
}

void MyControl::onPaint(wxPaintEvent& event)
{
    m_canvas->SetCurrent(*m_context);
    wxPaintDC dc(m_canvas);
    ..
    m_canvas->SwapBuffers();
}

a.dll または b.dll のみを開く限り、これは正常に機能します。また、a.dll または b.dll の複数のインスタンスを開くと、問題なく動作します。ただし、a.dll と b.dll を同時に開くとすぐに、ホスト シーケンサーは次の行を呼び出すとすぐにシャットダウンします (デバッグ中でも)。

m_canvas->SetCurrent(*m_context);

それは私が出力で見ることができるものです:

"host.exe": "D:\something\b.dll" geladen, Symbole wurden geladen.
14:49:02: ..\..\src\msw\app.cpp(364): 'RegisterClass(frame)' failed with error 0x00000582 (klasse ist bereits vorhanden).
14:49:03: ..\..\src\msw\app.cpp(373): 'RegisterClass(no redraw frame)' failed with error 0x00000582 (klasse ist bereits vorhanden).
14:49:03: ..\..\src\msw\app.cpp(383): 'RegisterClass(MDI parent)' failed with error 0x00000582 (klasse ist bereits vorhanden).
14:49:03: ..\..\src\msw\app.cpp(392): 'RegisterClass(no redraw MDI parent frame)' failed with error 0x00000582 (klasse ist bereits vorhanden).
....
4

1 に答える 1

2

出力のエラー メッセージは、wxWidgets を両方のプラグインに静的にリンクしたことを示しているようです。これは、wxWidgets ライブラリが 1 回だけ初期化されるため、プラグインを 1 つだけ、複数回ロードする限り機能します。

ただし、最初のプラグインがまだロードされている間に 2 番目のプラグインをロードしようとすると、2 番目のプラグインの wxWidgets の初期化が失敗し、遅かれ早かれクラッシュします。

両方のプラグインを wxWidgets で動的にリンクする必要があります。wxWidgets およびプラグイン / ロード可能モジュールについては Google を参照してください。この問題に関する詳細情報を見つけることができるはずです。

于 2009-03-18T22:02:40.243 に答える