マネージド コードから MIDI 機能に簡単にアクセスできるように、C++/CLI でライブラリを作成しました。ライブラリには、イベント ハンドラーとしてデリゲートを提供するクラスを含むマネージ クラスがあり、midiInOpen 関数の "ネイティブ" コールバック メソッドによって呼び出されます。
void MidiInDevice::MidiInProcNative(HMIDIIN midiInDevice, UINT msg, DWORD_PTR dwInstance, DWORD_PTR dwParam1, DWORD_PTR dwParam2)
{
if(MidiInProcedure == nullptr)
return;
MidiMessage^ message;
switch(msg)
{
case MIM_DATA:
{
message = gcnew MidiMessage(dwParam1, dwParam2);
break;
}
}
MidiInProcedure(this, message);
}
このメソッドをデリゲートに追加しました。これは、c++/cli ライブラリをロードする C# アプリケーションの一部です。
public void MidiInProc(SharpMidi.MidiInDevice midiInDevice, SharpMidi.MidiMessage message)
{
tbMidiInMessages.AppendText(String.Format("\n{0}: {1:X}", message.TimestampString, message.Message));
}
ただし、呼び出しで InvalidOperationException (クロススレッド操作が無効) が発生しAppendText
ます。
問題をグーグルで検索すると、例外の明らかなWindowsフォームのケースが殺到しました。これは、MidiMessageクラスが呼び出し機能を提供していないため、実際には役に立ちません。
では、この問題を解決するためのオプションは何ですか?
よろしく、 Xaser