在WinForms裏嵌入MediaPlayer的一些版本問題, tlbimp導入, 以及不導入而純用C#+字符串來動態調用.

網上不少寫使用WindowsMediaPlayer WMP控件的文章. windows

大多數都是從工具欄或COM導入. ide

最近正在作的CEF整合Asp.Net Core Blazor server side的過程當中, 函數

由於CEF編譯支持mp4的dll是涉及了版權的問題, 不能隨便乾的.  工具

要播放mp4, 能夠用WinForms代勞. 執行WMP只是一小段代碼, 不想導入dll , 測試

去查API.this

發現了微軟的官方文檔, 和我使用的MediaPlayer的API , 有出入.spa

?命令行

通過多方查證, 驗證, 發現原來 MediaPlayer 一共是2個版本3d

一個是最後到 6.4 的 classic 版本,  一個是從 7 以後的新版本. code

 

這篇博文用於紀錄二者的區別

首先參考這個:

http://w3schools.sinsixx.com/media/media_playerref.asp.htm

 

  6.4 7或之後
CLSID 22D6F312-B0F6-11D0-94AB-0080C74C7E95 6BF52A52-394A-11D3-B153-00C04F79FAA6
TypeLib c:\windows\system32\msdxm.tlb C:\Windows\system32\wmp.dll
TypeLib MediaPlayer WMPLib
ProgID   MediaPlayer.MediaPlayer WMPlayer.OCX
     
     

 

如今微軟那邊的SDK文檔地址爲

 https://docs.microsoft.com/en-us/windows/win32/wmp/player-object

能夠經過VS命令行執行  
tlbimp C:\Windows\system32\msdxm.tlb /out:d:\temp\msdxm_out.dll
tlbimp C:\Windows\system32\wmp.dll  /out:d:\temp\wmp_out.dll

來處處兩個dll , 用ILSPY查看:

 

 6.4的就這樣完結了 , 而7的類型列表就超長

 

 

 

 

 

 

總的說來 , 6.4 的 API 更直接一些. 所有都扔進 MediaPlayerClass裏了.  7的API很是多類型, 使用起來很複雜

 

 

若是不想導入這種類型的dll , 把C#當腳本用, 該如何?

使用這種代碼:

string mp4file = System.IO.Path.Combine(whe.WebRootPath, "demo.mp4");

//Windows Media Player 6.4 (classic) 
//type lib name "MediaPlayer"
//VS command : tlbimp C:\Windows\system32\msdxm.tlb /out:d:\temp\msdxm_out.dll
Type type = Type.GetTypeFromProgID("MediaPlayer.MediaPlayer.1");
Console.WriteLine(type.GUID);   // 22d6f312-b0f6-11d0-94ab-0080c74c7e95
System.Windows.Forms.Form form = new System.Windows.Forms.Form();
MyAxControl player = new MyAxControl(type);
form.Controls.Add(player);

form.MinimumSize = new System.Drawing.Size(400, 300);
form.Size = new System.Drawing.Size(800, 600);
form.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
form.Show();

type.InvokeMember("Open", System.Reflection.BindingFlags.InvokeMethod, null, player.GetOcx(), new object[] { mp4file });

 

 

 

 

 

string mp4file = System.IO.Path.Combine(whe.WebRootPath, "demo.mp4");

//Windows Media Player 7 or later
//tlbimp C:\Windows\system32\wmp.dll /out:d:\temp\wmp_out.dll
//type lib name "WMPLib"
//https://docs.microsoft.com/en-us/windows/win32/wmp/player-object
Type type = Type.GetTypeFromProgID("WMPlayer.OCX");
Console.WriteLine(type.GUID);   // 6bf52a52-394a-11d3-b153-00c04f79faa6
System.Windows.Forms.Form form = new System.Windows.Forms.Form();
MyAxControl player = new MyAxControl(type);
form.Controls.Add(player);

form.MinimumSize = new System.Drawing.Size(400, 300);
form.Size = new System.Drawing.Size(800, 600);
form.StartPosition = System.Windows.Forms.FormStartPosition.CenterScreen;
form.Show();

type.InvokeMember("URL", System.Reflection.BindingFlags.SetProperty, null, player.GetOcx(), new object[] { mp4file });

 

公用代碼:

    class MyAxControl : System.Windows.Forms.AxHost
    {
        public MyAxControl(Type type) : base(type.GUID.ToString())
        {
            this.Dock = System.Windows.Forms.DockStyle.Fill;
        }
    }

 

 

以上兩個代碼分別調用了6.4和7的 API . 已測試經過. 

注意, MyAxControl 的 Dispose 函數並不會隨着form關閉而Dispose掉.  須要手動Dispose

相關文章
相關標籤/搜索