mciSendString 的两个小坑
刚刚修正了自己用的小闹钟的代码。
坑1:REPEAT 选项的作用范围
原来用得好好的,之后选择 .wav 文件,居然不出声音了……
诶,MCI 肯定支持 .wav 的啊……
仔细想想,我以前都是选 .mp3 作为闹铃,和这个有关系吗?
查看源代码。
strSend = "PLAY " & STRING_SOUND_ALIAS & " REPEAT"
Call mciSendString(strSend, rbuf, 0, 0)
为了将我从睡梦中闹醒(一般来说我睡得很死的……),我选用了 REPEAT 选项来循环播放。
嗯,有。记得在哪里读到过,PLAY 指令的 REPEAT 选项只能作用于 MPEGVideo 类型的文件。(时间也这么晚了, 我想记录完直接睡觉,就不找引用来源了。)
那就很简单,打开的时候作为 MPEGVideo 打开就好了。
strSend = "OPEN " & Chr$(34) & FileName & Chr$(34) & " ALIAS " & STRING_SOUND_ALIAS & " TYPE MPEGVIDEO"
Call mciSendString(strSend, rbuf, 0, 0)
坑2:文件名长度
应该好了吧……来,试一下。
D:\Music\Themes\Anison Piano ~marasy animation songs cover on piano~ marasy\marasy - Anison Piano ~marasy animation songs cover on piano~.wav
嗯?没有特殊字符啊,为什么还是无法播放呢?(我没写调试输出,所以如果看成一个黑盒的话,我看到的结果只有无法播放。)总长度也明显小于 MAX_PATH,文件夹名称和文件名称长度也正常。
去看 mciSendString() 的返回字符串太麻烦了,推理吧。
你看,MCI 是一个历史久远的东西,那么……历史久远!历史久远的东西,在这种情况下能造成影响的,很大的可能性是8.3文件名(短文件名)。
那也好办。Windows API,GetShortPathName(),不要重复发明轮子。
strShortFilename = String$(MAX_PATH, vbNullChar)
Call GetShortPathName(FileName, strShortFilename, MAX_PATH)
strShortFilename = Strip(strShortFilename)
strSend = "OPEN " & Chr$(34) & strShortFilename & Chr$(34) & " ALIAS " & STRING_SOUND_ALIAS & " TYPE MPEGVIDEO"
Call mciSendString(strSend, rbuf, 0, 0)
(注意,上面的代码还有一个小坑。如果不进行字符串“修剪”去掉冗余的 vbNullChar 的话,也是无法播放的。不过我觉得这没必要单独提出来,就放在这括号里了。)
去睡觉
至少刚刚用了几个sample去测试,都通过了。今早应该能醒来吧……设置闹钟然后睡觉吧。
这篇文章就当是备忘录好了……看官别抱太大希望……
最后补充说明,MCI 其实是调用相应的已注册的解码器来工作的,所以其实如果安装了相应的解码器,就能播放相应格式的音频文件。当然,raw PCM 和 waveform 肯定要用 native 的 API 直接解决对不对……如果微软那群人不这么想我也没办法……
mciSendString 的两个小坑的更多相关文章
- 关于sqlmap的两个小坑
i春秋作家:__LSA__ 0x00 概述 近日在利用sqlmap注入测试时遇到一个奇怪的现象,高版本sqlmap无法检测出注入,但是低版本的可以测出注入,并且能跑出数据不是误报,经过对比测试和查看s ...
- swiper 初始化的两个小坑
1.当swiper loop设为true时,同时你又改变了sliderPerview的值,这时候轮播,按prev按钮到第一个时,会出现空白页: 解决办法:sliderPerview设置为auto,lo ...
- kvm 虚机环境碰到的两个小坑
1)当部署一个商用VA的时候,出现virsh version|grep "Using library" 返回错误,经过查看,发现里面有汉字,猜应该是这个原因导致无法检索到libvi ...
- win2016 配置IIS 和mysql5.7 迁移数据表的两个小坑
今天配置一整天,就IIS都装了一整天,都是没办法安装.net3.5的问题. 最后解决办法:https://help.aliyun.com/knowledge_detail/38203.html?spm ...
- Xcode7 的两个小坑
Xcode7 还在 beta.时不时崩一下什么的倒也是预料之中的事.没料到的是之前用着好好的,今天升完 El Capitan 之后,模拟器竟然不见了,设备倒是在 schema 栏右边里能看到.只是注明 ...
- Java实现快排+小坑+partition的两种思路
在做一道剑指Offer的题的时候,有道题涉及到快排的思路,一开始就很快根据以前的思路写出了代码,但似乎有些细节不太对劲,自己拿数据试了下果然.然后折腾了下并记录下一些小坑,还有总结下划分方法parti ...
- 这两个小技巧,让我的SQL语句不仅躲了坑,还提升了1000 倍
原文: https://cloud.tencent.com/developer/article/1465618 本次来讲解与 SQL 查询有关的两个小知识点,掌握这些知识点,能够让你避免踩坑以及提高查 ...
- [LeetCode]29 两数相除和一个小坑点
给定两个整数,被除数 dividend 和除数 divisor.将两数相除,要求不使用乘法.除法和 mod 运算符. 返回被除数 dividend 除以除数 divisor 得到的商. 示例 1: 输 ...
- C#中的Infinity有个小坑
(此文章同时发表在本人微信公众号"dotNET每日精华文章",欢迎右边二维码来关注.) 昨天家里有事,上网也不方便,就没有推送文章.今天很累,也不长篇大论了.简单介绍一下最近遇到的 ...
随机推荐
- Mysql 表分区
是否支持分区:mysql> show variables like '%partition%';+-----------------------+-------+| Variable_name ...
- Metaio获取当前追踪的对象的方法
重写 onTrackingEvent获取TrackingValues集合,然后通过TrackingValues的state属性的isTrackingState()方法判断是否为追踪状态,或者直接使用s ...
- bool型变量下标的时候javascript是不能允许的
jother编码是我最开始想写的内容,原因有两点:1.原理比较简单,不需要太多关于算法的知识.2.比较有趣,是在对javascript有了很深的理解之后催生的产物.如果你只需要知道jother编码和解 ...
- C#中的委托与事件并存的理由
更多资源:http://denghejun.github.io 问题 有了委托为什么还要有事件? 理论上,事件能完成的事情委托完全可以胜任,但是我们思考的这一方面是功能性,我们必须从他们各自的特点分析 ...
- Win7网上邻居提示未授予用户在此计算机上的请求登录类型解决办法
内容简介 装了Win7之后很多人遇到这样的问题,网上邻居访问Win7的电脑时出现“未授予用户在此计算机上的请求登录类型”问题.打开“控制面板”--“管理工具”--“本地安全策略”--“本地策略 ...
- Ajax全面基础学习(一)
快捷方法: $.get(url,[data],[callback],[type])get方法的[data]将被链在url后面[callback]是请求成功后的回调,可以得到响应数据,如果请求失败,看不 ...
- 登陆数据库,界面一直保持正在登陆的状态,oracle使用界面无法登陆
原因:关机时没有关闭oracle窗口. 导致在登陆数据库的时候,使用oracle的这个界面登陆时,界面一直保持''正在登陆''的状态,一旦点击就会卡住,使界面变得无法响应. 然后使用sqlplus仍然 ...
- UI控件(UIWebView)
本文主要记录UIWebView三方面内容: 1.基本的加载网页链接或文件: 2.网页js调用原生,也就是Cordova混合架构的原理: 3.原生调用js程序: 原生部分主要代码: @implement ...
- 企业IT管理员IE11升级指南【7】—— Win7和Win8.1上的IE11功能对比
企业IT管理员IE11升级指南 系列: [1]—— Internet Explorer 11增强保护模式 (EPM) 介绍 [2]—— Internet Explorer 11 对Adobe Flas ...
- 【VC++技术杂谈006】截取电脑桌面并将其保存为bmp图片
本文主要介绍如何截取电脑桌面并将其保存为bmp图片. 1. Bmp图像文件组成 Bmp是Windows操作系统中的标准图像文件格式. Bmp图像文件由四部分组成: (1)位图头文件数据结构,包含Bmp ...