网上很多写使用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查看:

 

 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