807
社区成员
发帖
与我相关
我的任务
分享
你问这个有何意义?
估计你根本不知道VB6的那三个 xxxPtr( )函数、及其作用吧!
说个“正题”:
VB6中用到的跟“String”I相关的API函数,大家基本都是用的“A版函数”;
而我都是用的“W版”(特定条件下只能用A版的除外)。
你没看到 mciSendString( )函数的第2个参数,在“一般”用法中都是 String类型的吗!而我用的是 Long类型。
用“W版API”的好处,是避免字符编码转换、提高代码运行效率。
因为在Windows内部,基本都是基于“W版函数”来操作的,
大多数“A版”只是一个“包装”而已(为了兼容性),在A版函数内把字符串数据转换成W版的、再调用W版完成操作。
在VB6中如果用A版的API,很可能造成“字符串数据”的多次编码转换:
在“调用前”,VB6把字符串数据“从W转A”放入“缓冲区”,传给API;
进入API,在API中又“从A转W”,再去调用W版;
如果有“字符串返回值”,在“API返回前”,把字符串数据“从W转A”返回给“调用者(VB6)”;
调用API返回后,VB6又会把“缓冲区”中的字符串数据,“从A转W”返还给相应参数。
而我用W版的API,就从根源上防止了这些累赘的转换操作。

给你一段代码参考一下。
打开某Mp3文件、从头到尾全部播放,是没问题的。
我先反复测试过,“指定区间播放”有可能结果不正确(不知道缘故,MSDN上的长篇大论几乎全是“废话”)。
Option Explicit
Private Declare Function mciSendString Lib "winmm.dll" Alias "mciSendStringW" ( _
ByVal lpstrCommand As Long, _
ByVal lpstrReturnString As Long, _
ByVal uReturnLength As Long, _
ByVal hwndCallback As Long) As Long
Private strFile As String
Private mlFlag As Long
Private Sub PlayMp3()
Dim strOpenCMD As String
Dim strPlayCMD As String
mlFlag = vbTrue
strOpenCMD = "open " & strFile & " Alias MyMp3"
strPlayCMD = "play MyMp3 from 15000 to 120000"
' 从15秒处开始播放到120秒处(命令串中的时间单位是ms)
' 不过发现很不靠谱:128Kbps固定码率的那首歌基本正确;另一首256Kbps变比码率的“差之千里”
Call mciSendString(StrPtr(strOpenCMD), 0&, 0&, 0&)
Call mciSendString(StrPtr(strPlayCMD), 0&, 0&, 0&)
End Sub
Private Sub StopMp3()
If (Not mlFlag) Then Exit Sub
Call mciSendString(StrPtr("close MyMp3"), 0&, 0&, 0&)
mlFlag = vbFalse
End Sub
Private Sub Command1_Click()
Call PlayMp3
End Sub
Private Sub Command2_Click()
Call StopMp3
End Sub
Private Sub Form_Load()
mlFlag = vbFalse
'strFile = "F:\Mp3\爱江山更爱美人.mp3" ' 256Kbps(VBR) 05:19
strFile = "F:\Mp3\半生缘.mp3" ' 128Kbps 02:13
End Sub
Private Sub Form_Unload(Cancel As Integer)
If (mlFlag) Then Call StopMp3
End Sub