在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 ...
随机推荐
- 【雕爷学编程】MicroPython动手做(04)——零基础学MaixPy之尝试运行
1.hello micropython #MicroPython动手做(04)——零基础学MaixPy之基本示例 #程序之一:hello micropython #MicroPython动手做(04) ...
- 使用Redis——拳打南山敬老院,脚踩北斗幼儿园
拳打南山敬老院,脚踩北斗幼儿园 Redis 你说你用过对吧,你们怎么用的? 面试官您好,因为传统的关系型数据库如Mysql已经不能适用所有的场景了,比如秒杀的库存扣减,APP首页的访问流量高峰等等,都 ...
- Codeforces1157B(B题)Long Number
B. Long Number You are given a long decimal number aa consisting of nn digits from 11 to 99. You als ...
- MySQL常见面试题索引、表设计
正确使用索引的条件 1.建立索引的列的重复度不能太高 2.条件列不能参与计算 3.不能使用函数 4.条件中不能使用范围 5.不要使用like '%c' 6.条件中用or a=0 or b=1 or c ...
- asp.net MVC3.0 中@Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction
asp.net MVC3.0 中@Html.Partial,@Html.Action,@Html.RenderPartial,@Html.RenderAction 1.带有Render的方法返回值是v ...
- poj3177 无向连通图加多少条边变成边双连通图
Redundant Paths Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 15752 Accepted: 6609 ...
- .Net基础之5——复杂数据类型
(1)复习 1.变量 int double string char bool decimal 变量的使用规则:先声明再赋值最后使用 2.Camo Pascal 3.运算符 ...
- pytest之fixture使用详解
简介: fixture区别于unnitest的传统单元测试(setup/teardown)有显著改进: 1.有独立的命名,并通过声明它们从测试函数.模块.类或整个项目中的使用来激活. 2.按模块化的方 ...
- 关于Java两点需要更新的知识
HashMap的初始容量 背景 很多人可以把HashMap的原理描述的很溜.比如JDK1.7之前,底层数据结构是数组+链表.JDK1.8之后,出于效率上的考虑,在数组长度大于64,链表长度大于8的时候 ...
- NO.4 CCS运行第一个demo(本地)
前面介绍了基本的SDK内容,这次主要是本地实际应用CCS实现程序的运行. 首先我们进入CCS,我简单介绍下界面: 界面很简洁,通俗易懂(怎么跟STM32IDE这么像) 由于我们还不会写程序,我们先导入 ...