网上很多写使用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#+字符串来动态调用.的更多相关文章

  1. 在JavaScript里嵌入大量字符串常量的方法

    [转]在JavaScript文件里嵌入大量字符串常量是经常遇到的事.有时为了省事,就把一些界面的HTML和CSS直接写在JS文件里.数量少还好,多的话就密密麻麻的一坨文字,讲究美观的文艺青年们,会用大 ...

  2. Android H5混合开发(3):原生Android项目里嵌入Cordova

    前言 如果安卓项目已经存在了,那么如何使用Cordova做混合开发? 方案1(适用于插件会持续增加或变化的项目): 新建Cordova项目并添加Android平台,把我们的安卓项目导入Android平 ...

  3. 原生Android项目里嵌入Cordova

    Android H5混合开发():原生Android项目里嵌入Cordova 如果安卓项目已经存在了,那么如何使用Cordova做混合开发? 方案1(适用于插件会持续增加或变化的项目): 新建Cord ...

  4. 在WinForm里嵌入WPF模拟公交运行状态

    公司有个公交项目,模拟公交运行的时候使用的纯WinForm技术,5秒钟刷新一次,不仅看起来感觉很丑,而且性能上很有问题,听说一段时间后就会因为内存问题崩溃(估计是没释放非托管资源吧,不断重绘,非托管资 ...

  5. 如何在原生Android项目里嵌入Cordova

    背景: 这段时间在维护一个Cordova混合项目,以前稍微接触过Cordova,也写过简单的纯纯的Cordova的Demo,但是没有尝试过混合原生的Cordova. 在接到项目后比较了一下项目架构和C ...

  6. 在SWING里嵌入SWT的组件

    http://zhanghan3366.blog.163.com/blog/static/6966305220110505351568/ ——————————————————————————————— ...

  7. QT里嵌入Python

    刚看到一个软件,叫做,明明是QT做的,却带了很多pyd文件(Python编译后的文件),上网一查,果然有这套相关的东西: https://doc.qt.io/archives/qq/qq23-pyth ...

  8. thinkphp 模板里嵌入 php代码

    <php> echo 'nihao';</php><?phpecho 'gge';?> Php代码可以和标签在模板文件中混合使用,可以在模板文件里面书写任意的PHP ...

  9. html里嵌入CSS的三种方式

    在HTML中定义CSS的方式有:Embedding(嵌入式).Linking(引用式).Inline(内联式),下面通过实例为大家详细介绍下它们的特点   在HTML中常用以下3种方式定义CSS:Em ...

随机推荐

  1. SourceTree 3.1.3 版本跳过bitbucket注册方法(亲测好用)

    1.首先下载并安装好git程序. 2.接着下载并执行SourceTreeSetup-3.1.3.exe,会进入登录或注册bitbucket的界面,我只是想用软件,并不想去注册账号.怎么办?请往下看. ...

  2. 06.drf(django)的权限

    默认配置已经启用权限控制 settings 'django.contrib.auth', 默认 migrate 会给每个模型赋予4个权限,如果 ORM 类不托管给django管理,而是直接在数据库中建 ...

  3. Java-main方法中调用非static方法

    java的calss中,在public static void main(String[] args) { }方法中调用非static的方法:在main方法中创建该calss的对象,用对象调用非sta ...

  4. Java——异常处理,数据库连接

    在学习数据库连接时看到try(){}结构,查了一下写在这里: import java.sql.Connection; import java.sql.DriverManager; import jav ...

  5. MvvmLight + Microsoft.Extensions.DependencyInjection + WpfApp(.NetCore3.1)

    git clone MvvmLight失败,破网络, 就没有直接修改源码的方式来使用了 Nuget安装MvvmLightLibsStd10 使用GalaSoft.MvvmLight.Command命名 ...

  6. 关于oauth安全

    白话认证流程 A)用户打开客户端以后,客户端要求用户给予授权.(比如说你登陆淘宝,通过QQ这个第三方来登录时,这个时候淘宝将你引导至QQ的认证服务器) B)用户同意给客户端授权.(这个时候在你手机上弹 ...

  7. ATT&CK如何落地到安全产品

    科普:ATT&CK是什么 ATT&CK的提出是为了解决业界对黑客行为.事件的描述不一致.不直观的问题,换句话说它解决了描述黑客行为 (TTP) 的语言和词库,将描述黑客攻击的语言统一化 ...

  8. STM32与匿名上位机通信——使用串口DMA实现

    背景:匿名上位机功能强大,这里想要采用匿名上位机输出一些调试信息,以波形的形式显示,方便观察和调试. 平台: 硬件:STM32F405RGT6 通信:2.4G zigbee无线串口收发模块 CC253 ...

  9. 【asp.net core 系列】2 控制器与路由的恩怨情仇

    0. 前言 在上一篇文章中,我们初步介绍了asp.net core,以及如何创建一个mvc项目.从这一篇开始,我将为大家展示asp.net core 的各种内容,并且尝试带领大家来挖掘其中的内在逻辑. ...

  10. Rocket - devices - PLIC

    https://mp.weixin.qq.com/s/FR3yeLLBqy0n-fflw-ATgg 简单介绍TLPLIC的实现. 1. GatewayPLICIO PLIC是Platform-Leve ...