2017-01-16 15 views
0

DirectXの管理コードを使用して、ある時点でビデオを再生するC#Windowsフォームアプリケーションを作成しています。私はビデオを再生した直後にアプリケーションを終了したいので、ビデオのエンディングイベントを処理しようとしましたが、それは発生し、例外です。NullReferenceExceptionの処理ビデオの終了イベント

using System; 
using System.Collections.Generic; 
using System.ComponentModel; 
using System.Data; 
using System.Drawing; 
using System.Linq; 
using System.Text; 
using System.Threading.Tasks; 
using System.Windows.Forms; 
using Microsoft.DirectX.DirectSound; 
using Microsoft.DirectX.AudioVideoPlayback; 
using Microsoft.DirectX; 
using System.Diagnostics; 

namespace Picture_Button 
{ 
    public partial class Form1 : Form 
    { 
     Video video = new Video("C:\\Users\\Pushkin\\Desktop\\PPAP.mp4"); 
     //Video video = new Video("C:\\Users\\Pushkin\\Desktop\\PPAP.mp4"); 
     private int clicks = 0; 
     public Form1() 
     { 
      InitializeComponent(); 
      pictureBox1.SizeMode = PictureBoxSizeMode.Zoom; 
      video.Ending += new System.EventHandler(this.Video_Ending); 
      //video.Ending += Video_Ending; 
     } 

     private void pictureBox1_Click(object sender, EventArgs e) 
     { 
      clicks++; 
     } 

     private void pictureBox1_MouseDown(object sender, MouseEventArgs e) 
     { 
      switch (clicks) 
      { 
       case 0: pictureBox1.Image = Properties.Resources.Pineapple; break; 
       case 1: pictureBox1.Image = Properties.Resources.Apple; break; 
       case 2: pictureBox1.Image = Properties.Resources.Pen; break; 
       case 3: 
        { 
         video.Owner = this; 
         video.Play(); 
         /*video.Dispose(); 
         Application.Exit();*/ 
        } 
        break; 
      } 
     } 
     private void Video_Ending(object sender, EventArgs e) 
     { 
      //throw new NotImplementedException(); 
      video.Dispose(); 
      Application.Exit(); 
     } 
    } 
} 

例外:

System.NullReferenceException occurred 
    HResult=-2147467261 
    Message=Object reference not set to an instance of an object. 
    Source=Microsoft.DirectX.AudioVideoPlayback 
    StackTrace: 
    at VideoWndProc(HWND__* hWnd, UInt32 uMsg, UInt32 wParam, Int32 lParam) 
    InnerException: 

はまた、私はプログラムが終了イベントのコードなしで完璧に動作していることに気付きました はここのコードです。

+0

コードが完全に管理されている場合は、手動でビデオを処分する必要がありますか? –

+0

私はその投稿を見ましたが、私のコードで何が間違っているのか分かりません。 –

+0

手動で処理する必要があるかどうかわかりません –

答えて

1

例外は、ビデオコンポーネントがイベントハンドラが返された後でも処理を試みるために発生します。したがって、コンポーネントをハンドラ内に破棄することはできません。

ハンドラのフォームのCloseメソッドを呼び出します。これにより、ハンドラが返され、ビデオコンポーネントが終了した後にフォームが閉じられます。

private void Video_Ending(object sender, EventArgs e) 
{ 
    Close(); 
} 

この場合、ビデオコンポーネントを廃棄することは、フォームを閉じた後にアプリケーションが終了することがわかっているためです。 (プロセスが終了すると、そのリソースはすべて解放されます)。

このフォームが大きなプロジェクトの一部だった場合は、ビデオコンポーネントを廃棄することをお勧めします。その正しい場所は、フォームのFormCloseイベントです。

+0

コードを追加してください。 –

+0

ありがとう、それは私のコンピュータでうまくいきますが、リリースは他のコンピュータでクラッシュします、これはこれに関連しているのですか? –

+0

@ CosminPetolea問題ごとに1つの質問。完全なエラー情報を投稿してください。ちょうどヒント:.NETフレームワーク3.5が他のコンピュータにインストールされていることを確認し、 "Direct X for Managed Code"用のdllを配布する必要があります。また、ビデオフォーマット用の有効なコーデックがインストールされていることを確認してください。 – NineBerry

関連する問題