フォームにAxWMPLib.AxWindowsMediaPlayer
あります。フォームを閉じると、「保護されたメモリの読み取りまたは書き込みを試みました。これは、他のメモリが破損していることを示していることがよくあります。」と表示されます。例外。フォームを非表示にしても問題ありませんが、閉じても問題ありません。コンポーネントがフォームから削除されると、すべて問題ありません。
これはWinforms.Net3.5です。
助けていただければ幸いです。
フォームにAxWMPLib.AxWindowsMediaPlayer
あります。フォームを閉じると、「保護されたメモリの読み取りまたは書き込みを試みました。これは、他のメモリが破損していることを示していることがよくあります。」と表示されます。例外。フォームを非表示にしても問題ありませんが、閉じても問題ありません。コンポーネントがフォームから削除されると、すべて問題ありません。
これはWinforms.Net3.5です。
助けていただければ幸いです。
これは私に起こっていました.キーを押している間にフォームを閉じるときでした.
処理するキー イベントがある場合、WMP コントロールが問題を引き起こすようです。
Form.KeyPreview = True の例
Sub Form_KeyDown(e As KeyEventArgs)
AxWindowsMediaPlayer1.Dispose()
End Sub
アクセス違反を引き起こします。
Sub Form_KeyDown(e As KeyEventArgs)
e.Handled = True
AxWindowsMediaPlayer1.Dispose()
End Sub
キーの押下が WMP コントロールに到達するのをブロックされるため、きれいに閉じます。
フォームが閉じられると、コントロールが破棄されるのと同じことが起こります。
.NET アプリケーションで ActiveX オブジェクトを操作する場合、終了時にガベージ コレクションを強制する必要がある場合があります。私は通常、次を使用して Form_Closing でこれを行います。
GC.WaitForPendingFinalizers()
GC.Collect()
また、オブジェクトのイベント ハンドラーをセットアップしている場合は、それらを明示的に切断する必要があります。ActiveX オブジェクトがごみ箱でアクティブなままであり、破棄された後でもイベント ハンドラーを呼び出そうとすることが何度もありました。
オブジェクトを破棄する前に、再生が停止していることを確認することも価値がある場合があります。
私はそれを持っていると思います:
private void Form1_FormClosing(object sender, FormClosingEventArgs e)
{
axWindowsMediaPlayer1.close();
}
ドキュメントhttp://msdn.microsoft.com/en-us/library/windows/desktop/dd562388(v=vs.85).aspxでメソッドを見つけただけ です。今はずっと良くなっているようです。
ActiveX オブジェクトは、親フォームが閉じられたときに正しい順序で閉じられるように、いくつかの微妙な依存関係を持っている可能性があります。そうしないと、gc が実行されるまで生き続ける可能性があります - コントロールのインターフェイスを調べて、実行する必要があると思われるメソッドを探してみてください。オブジェクトを閉じるか破棄してそれらを呼び出します。