在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 ...
随机推荐
- Arthas 使用(一) —— 基础命令
Arthas 简介 Arthas 是 Alibaba 开源的 Java 诊断工具,根据官方介绍,它提供了如下工功能: 官方文档地址: https://alibaba.github.io/arthas/ ...
- webpack4多页应用HTML按需添加入口依赖chunk【html-webpack-plugin & html-inline-entry-chunk-plugin】
在webpack4中使用splitChunkPlugin时,根据需要将公共代码拆分为多个依赖后,需要在创建htmlWebpackPlugin时候按需引入对应入口文件依赖的chunk.但是html-we ...
- 【雕爷学编程】Arduino动手做(42)---PM2.5粉尘传感器
37款传感器与模块的提法,在网络上广泛流传,其实Arduino能够兼容的传感器模块肯定是不止37种的.鉴于本人手头积累了一些传感器和模块,依照实践(动手试试)出真知的理念,以学习和交流为目的,这里准备 ...
- String的正则函数
String的正则函数: 查找敏感词: 4种情况 1. 查找一个固定的敏感词的位置i: var i=str.indexOf("敏感词",fromi) 在str中,从fromi位置开 ...
- Nodejs模块介绍
1.模块系统 require:引入模块,返回一个对象 module:指代当前的模块对象 module.exports:当前模块的导出对象 exports:指代module.exports __file ...
- Djano之ORM多表查询操作
# 把 model 转化为 迭代器去循环 MODEL.objects.all().iterator() # 等同于 values, values_list, 但是 only 这种方式 获取字段属性依旧 ...
- linux文档目录
- 理解javascript中的连续赋值
之前在扒源码时经常看到类似的连续赋值操作: var a = b = 1; 在某度搜了众多前辈的博客,总算对这骚操作有点眉目. Case analysis 首先,javascript中连续赋值最典型 ...
- jquery 根据 option 的 text 定位选中 option
$('#test option[text="b"]').attr("selected",true); 上面的方法在 jquery 低于 1.4.2 的版本(含) ...
- poj2125最小点权覆盖+找一个割集
Destroying The Graph Time Limit: 2000MS Memory Limit: 65536K Total Submissions: 8503 Accepted: 2 ...