3


1

AxWindowsMediaPlayerを含むフォームを閉じたときのAccessViolation例外

フォーム上に `AxWMPLib.AxWindowsMediaPlayer`があります。 フォームを閉じると、「保護されたメモリを読み書きしようとしました」というメッセージが表示されます。 これは多くの場合、他のメモリが破損していることを示しています。 "例外。 フォームを非表示にすることは問題ありませんが、閉じることはできません。 コンポーネントがフォームから削除されたら、すべて問題ありません。

これはWinforms .Net3.5です。

任意の助けをいただければ幸いです。

4 Answer


3


これは私に起こりました、そしてそれはキーを押している間フォームを閉じるときでした。

処理する重要なイベントがある場合、WMPコントロールは問題を引き起こすようです。

Form.KeyPreview = Trueの例

Sub Form_KeyDown(KeyEventArgsとして)AxWindowsMediaPlayer1.Dispose()End Sub

アクセス違反が発生します。

Sub Form_KeyDown(KeyEventArgsとしてのe)e.Handled = True AxWindowsMediaPlayer1.Dispose()End Sub

キーを押してもWMPコントロールに到達できないため、正しく閉じます。

コントロールを破棄するようにフォームが閉じられたときにも同じことが起こります。


2


NETアプリケーションでActiveXオブジェクトを操作するときに、終了時にガベージコレクションを強制する必要がある場合があります。 私は一般的にこれを使用してForm_Closingでこれを行います:
GC.WaitForPendingFinalizers()GC.Collect()

また、オブジェクトに対してイベントハンドラを設定している場合は、それらを明示的に切断したいでしょう。 ActiveXオブジェクトはゴミ箱内でアクティブなままで、破棄された後もイベントハンドラを呼び出そうとすることが何度もありました。

オブジェクトを破棄しようとする前に再生が停止したことを確認することも価値があります。


0


ActiveXオブジェクトは、親フォームが閉じられるときに正しい順序で閉じられることに敏感な依存関係を持っているかもしれません、そうでなければ、それらはgcが実行されるまで生き続けるかもしれません。オブジェクトを閉じる、または破棄して呼び出します。


0


私はそれがあると思います:

プライベートvoid Form1 FormClosing(オブジェクト送信側、FormClosingEventArgs e){axWindowsMediaPlayer1.close(); }