欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

在WinForms里嵌入MediaPlayer的一些版本问题, tlbimp导入, 以及不导入而纯用C#+字符串来动态调用.

程序员文章站 2022-05-28 14:14:05
网上很多写使用WindowsMediaPlayer WMP控件的文章. 大多数都是从工具栏或COM导入. 最近正在做的CEF整合Asp.Net Core Blazor server side的过程中, 因为CEF编译支持mp4的dll是涉及了版权的问题, 不能随便干的. 要播放mp4, 可以用Win ......

网上很多写使用windowsmediaplayer wmp控件的文章. 

大多数都是从工具栏或com导入. 

最近正在做的cef整合asp.net core blazor server side的过程中, 

因为cef编译支持mp4的dll是涉及了版权的问题, 不能随便干的.  

要播放mp4, 可以用winforms代劳. 执行wmp只是一小段代码, 不想导入dll , 

去查api.

发现了微软的官方文档, 和我使用的mediaplayer的api , 有出入.

?

经过多方查证, 验证, 发现原来 mediaplayer 一共是2个版本

一个是最后到 6.4 的 classic 版本,  一个是从 7 之后的新版本. 

 

这篇博文用于纪录两者的区别

首先参考这个:

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文档地址为

 

可以通过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查看:

在WinForms里嵌入MediaPlayer的一些版本问题, tlbimp导入, 以及不导入而纯用C#+字符串来动态调用.

 

 6.4的就这样完结了 , 而7的类型列表就超长

 

 

在WinForms里嵌入MediaPlayer的一些版本问题, tlbimp导入, 以及不导入而纯用C#+字符串来动态调用.

 在WinForms里嵌入MediaPlayer的一些版本问题, tlbimp导入, 以及不导入而纯用C#+字符串来动态调用.

 

 

 

总的说来 , 6.4 的 api 更直接一些. 全部都扔进 mediaplayerclass里了.  7的api非常多类型, 使用起来很复杂

 

 

如果不想导入这种类型的dll , 把c#当脚本用, 该如何?

使用这种代码:

在WinForms里嵌入MediaPlayer的一些版本问题, tlbimp导入, 以及不导入而纯用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 });

 

 

 

 

在WinForms里嵌入MediaPlayer的一些版本问题, tlbimp导入, 以及不导入而纯用C#+字符串来动态调用.

 

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