在WinForms里嵌入MediaPlayer的一些版本问题, tlbimp导入, 以及不导入而纯用C#+字符串来动态调用.
网上很多写使用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文档地址为
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(, );
form.Size = new System.Drawing.Size(, );
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(, );
form.Size = new System.Drawing.Size(, );
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
在WinForms里嵌入MediaPlayer的一些版本问题, tlbimp导入, 以及不导入而纯用C#+字符串来动态调用.的更多相关文章
- 在JavaScript里嵌入大量字符串常量的方法
[转]在JavaScript文件里嵌入大量字符串常量是经常遇到的事.有时为了省事,就把一些界面的HTML和CSS直接写在JS文件里.数量少还好,多的话就密密麻麻的一坨文字,讲究美观的文艺青年们,会用大 ...
- Android H5混合开发(3):原生Android项目里嵌入Cordova
前言 如果安卓项目已经存在了,那么如何使用Cordova做混合开发? 方案1(适用于插件会持续增加或变化的项目): 新建Cordova项目并添加Android平台,把我们的安卓项目导入Android平 ...
- 原生Android项目里嵌入Cordova
Android H5混合开发():原生Android项目里嵌入Cordova 如果安卓项目已经存在了,那么如何使用Cordova做混合开发? 方案1(适用于插件会持续增加或变化的项目): 新建Cord ...
- 在WinForm里嵌入WPF模拟公交运行状态
公司有个公交项目,模拟公交运行的时候使用的纯WinForm技术,5秒钟刷新一次,不仅看起来感觉很丑,而且性能上很有问题,听说一段时间后就会因为内存问题崩溃(估计是没释放非托管资源吧,不断重绘,非托管资 ...
- 如何在原生Android项目里嵌入Cordova
背景: 这段时间在维护一个Cordova混合项目,以前稍微接触过Cordova,也写过简单的纯纯的Cordova的Demo,但是没有尝试过混合原生的Cordova. 在接到项目后比较了一下项目架构和C ...
- 在SWING里嵌入SWT的组件
http://zhanghan3366.blog.163.com/blog/static/6966305220110505351568/ ——————————————————————————————— ...
- QT里嵌入Python
刚看到一个软件,叫做,明明是QT做的,却带了很多pyd文件(Python编译后的文件),上网一查,果然有这套相关的东西: https://doc.qt.io/archives/qq/qq23-pyth ...
- thinkphp 模板里嵌入 php代码
<php> echo 'nihao';</php><?phpecho 'gge';?> Php代码可以和标签在模板文件中混合使用,可以在模板文件里面书写任意的PHP ...
- html里嵌入CSS的三种方式
在HTML中定义CSS的方式有:Embedding(嵌入式).Linking(引用式).Inline(内联式),下面通过实例为大家详细介绍下它们的特点 在HTML中常用以下3种方式定义CSS:Em ...
随机推荐
- filebeat-kafka:WARN producer/broker/0 maximum request accumulated, waiting for space
You need to configure 3 things: Brokers Filebeat kafka output Consumer Here a example (change paths ...
- HTML5新特性--svg-echarts(重点)-拖动API-WebWorker
一.html5新特性--svg--(折线/渐变特效对象/滤镜) #折线:多个坐标点组件一条折线 <polyline points="50,50 70,55 60,66 " s ...
- 重学 Java 设计模式:实战工厂方法模式
作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获!
- python3.x 基础一:str字符串方法
*字符串不能更改值 数据类型字符串str | capitalize(...) 返回字符串中第一个字母大写 | S.capitalize() -> str | | ...
- iterm 分屏切换快捷键与配色设置
(1)快捷键设置 ⌘ + d: 垂直分屏, ⌘ + shift + d: 水平分屏. ⌘ + ]和⌘ + [在最近使用的分屏直接切换. ⌘ + opt + 方向键切换到指定位置的分屏. ⌘ + 数字: ...
- System.Web.mail ----虚拟发件人发送邮件
转载别人的 使用SMTP发送邮件 说到邮件发送,先提一下SMTP. SMTP的全称是“Simple Mail Transfer Protocol”,即简单邮件传输协议.它是一组用于从源地址到目的 ...
- codeforces Gym - 101485 D Debugging (2015-2016 Northwestern European Regional Contest (NWERC 2015))
题目描述: 点击打开链接 这题题意其实很不好理解,你有一个n行的程序,现在程序运行了r时间之后停止了运行,证明此处有一个bug,现在你需要在程序中加printf来调试找到bug所在的位置,你每次加一个 ...
- scrapy.cmdline.execute
scrapy的cmdline命令 1.启动爬虫的命令为:scrapy crawl (爬虫名) 2.还可以通过以下方式来启动爬虫 方法一:创建一个.py文件(这里的爬虫文件名可以自己定义,例:myspi ...
- 【Python】利用python自动发送邮件
前言 在训练网络的过程中,需要大量的时间,虽然可以预估网络训练完成时间,但蹲点看结果着实有点不太聪明的亚子. 因此,参照师兄之前发的python利用smtp自动发邮件的代码,我作了些调整,并参照网上的 ...
- MyBatis的使用增删改查(两种分页查询)
文件目录 写一下每个文件的代码 UserDao.java package cn.zys.dao; import java.io.IOException; import java.util.List; ...