Multiple AxWindowsMediaPlayer controls exception: System.Runtime.InteropServices.COMException' in AxInterop.WMPLib.dll

0

Developing a winforms C# 4.5 on Win10 that creates multiple AxWindowsMediaPlayer control objects dynamically on Form1 (the only form). Relative code segments look like this:

        axWMPn[zi] = new AxWindowsMediaPlayer();
        ((ISupportInitialize)(axWMPn[zi])).BeginInit();
        axWMPn[zi].Name = "Zone " + zi;     //Zone name + index
        axWMPn[zi].Tag = "Z" + zi;  // "Z" + Zone index
        axWMPn[zi].Location = loc;
        axWMPn[zi].Size = sz;
        Controls.Add(axWMPn[zi]);
        ((ISupportInitialize)(axWMPn[zi])).EndInit();
        axWMPn[zi].uiMode = "none";
        axWmpDisplayZones.Add(axWMPn[zi].Tag.ToString(), axWMPn[zi]);

        axWMPn[zi].StatusChange += axWMPx_StatusChange;
        axWMPn[zi].PlayStateChange += axWMPx_PlayStateChange;

I create 6 zones - 3 are assigned static JPEG images and the other 3 are used for video (*.avi and *.mov). The video files are assigned like this:

   private void playVideo(string file)
   {
        int tc6 = 0;
        axWMPn[0].URL = file;
        axWMPn[4].URL = file;
        axWMPn[5].URL = file;
        axWMPn[6].URL = "C:/test/AmexDonut.mov";
   }

This all works - playVideo is called from another process and the first time all videos run without errors; however when I call playVideo a second time I intermittently get a COMException error:

Exception thrown: 'System.Runtime.InteropServices.COMException' in AxInterop.WMPLib.dll -- Message: The message filter indicated that the application is busy. (Exception from HRESULT: 0x8001010A (RPC_E_SERVERCALL_RETRYLATER)).

Notes: 1. If I just do 2 axWMPn[x].URL=file it always works no COMException; if I had a third axWMPn[x].URL=file it mostly works with a COMException once every few dozen calls to playVideo. Adding the 4th awWMPn[x].URL=file almost always causes the COMException but not every single time.

So I did following to see more about what was going on:

   private void playVideo(string file)
    {
        int tc6 = 0;

        try
        {
            axWMPn[0].URL = file;
        }
        catch (System.Runtime.InteropServices.COMException comEx)
        {
            Console.WriteLine("playVideo COMException 0: " + comEx.Source + "  -- " + comEx.Message);
        }


        try
        {
            axWMPn[4].URL = file;
        }
        catch (System.Runtime.InteropServices.COMException comEx)
        {
            Console.WriteLine("playVideo COMException 4: " + comEx.Source + "  -- " + comEx.Message);
        }


        try
        {
            axWMPn[5].URL = file;
        }
        catch (System.Runtime.InteropServices.COMException comEx)
        {
            Console.WriteLine("playVideo COMException 5: " + comEx.Source + "  -- " + comEx.Message);
        }

    Again:
        try
        {
            axWMPn[6].URL = "C:/test/AmexDonut.mov";
        }
        catch (System.Runtime.InteropServices.COMException comEx)
        {
            tc6++;
            Console.WriteLine("playVideo COMException 6: try again count = " + tc6 + "  - " + comEx.Source + "  -- " + comEx.Message);
            goto Again;
        }

The COMException "busy" when it occurs always occurs in axWMPn[6].URL=file and putting the goto Again in works - tc6 will always just be 1. So merely trying one more time to assign axWMPn[6].URL=file always works. It never takes more than 1 additional try (tc6 never goes beyond 1).

I could leave it this way - I have run it dozens of times and it works just fine; but it sure seems like a bad hack. Does anybody have any thoughts or ideas?

Thanks for any input

c#
winforms
axwindowsmediaplayer
asked on Stack Overflow Apr 2, 2017 by Neal Davis

0 Answers

Nobody has answered this question yet.


User contributions licensed under CC BY-SA 3.0