首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VB >

很少的几行代码,却令小弟我如些头疼,在vb吧与吧主cbm666探讨了很长时间,就是弄不明白为什么?同样的几行代码,在不同的机器上为何执行效果不同

2012-03-09 
很少的几行代码,却令我如些头疼,在vb吧与吧主cbm666探讨了很长时间,就是弄不明白为什么?同样的几行代码,在

很少的几行代码,却令我如些头疼,在vb吧与吧主cbm666探讨了很长时间,就是弄不明白为什么?同样的几行代码,在不同的机器上为何执行效果不同
很少的几行代码,却令我如些头疼,在vb吧与吧主cbm666探讨了很长时间,就是弄不明白为什么?同样的几行代码,在不同的机器上为何执行效果不同呢?
------------------------
由于想学习资源文件的使用,从网上下载了cbm666的源码研究.
功能就是将一个wav文件存到资源文件中,然后单击按钮command1就播放这段wav音乐.

可是同样的代码,在我家中与单位,执起起来效果不同.
请看我的代码中的注释就明白了.
如果我表述不清,请看一下我发的源贴.
http://post.baidu.com/f?kz=250275345

代码如下:
'播放   WAVE   声音(只允许.wav)

Option   Explicit
Private   Declare   Function   sndPlaySoundFromMemory   Lib   "winmm.dll "   Alias   "sndPlaySoundA "   (lpszSoundName   As   Any,   ByVal   uFlags   As   Long)   As   Long
Const   SND_ASYNC   =   &H1
Const   SND_MEMORY   =   &H4
Dim   bArr()   As   Byte                     '这句在这里声明可以,可是放在command的单击事件声明就是不可以,不知为什么
       


Private   Sub   Command1_Click()

        '如果将barr数组定义在下面这个位置,则三台电脑都有出现vb异常关闭的现象,但不是每次都关闭,没找到原因.
        'Dim   bArr()   As   Byte                   '放在这里声明不可以(在单位的两台电脑上测试不发声,在家中试则是编译成exe文件后第一次单击command不出声,以后就出声,不编译在vb环境中测试没有问题,只是编译后才出现)
       
        bArr   =   LoadResData(101,   "CUSTOM ")
        DoEvents
        sndPlaySoundFromMemory   bArr(0),   SND_ASYNC   Or   SND_MEMORY
      '   MsgBox   "等一下 "                         '如果barr变量定义在command的单击事件中,加这一句,在单位的电脑上将会出声,
        'Erase   bArr                                   '加上这一句,在单位的两台电脑上就不出声了,可是在家中的电脑上,却没有任何变化。
End   Sub



[解决办法]
你自己几台机器操作系统都一样么? winmm.dll 的版本也都一样么?
[解决办法]
我觉得因为 不同步的关系造成的

因为VB在处理一个事件过程 和 用sndPlaySoundFromMemory 播放资源不是同1个进程
由于开始执行到 sndPlaySoundFromMemory 后 Command1_Click 很短事件内就执行完毕了
由于 bArr 在事件中申明的 一旦事件结束后 bArr的数据就被清空了
自然而然 sndPlaySoundFromMemory 会不能播放了
[解决办法]
ayalicer(小刀惋心) 说得没错,sndPlaySoundFromMemory 在播放结束前一直需要用到 bArr 内的数据:
定义在模块头,就不会自动清除,只要不关闭窗体,播放成功;
定义在模块头,但是调用了 Erase,数据丢失后播放失败;
定义在过程中,那么过程结束就自动清除,播放失败;
定义在过程中,但是加了 MsgBox 阻止,如果在足够晚的时候关闭 MsgBox,那么播放也能成功;在这里不同机器有不同表现,肯定是你的 MsgBox 点击的比较早,而且推测 sndPlaySoundFromMemory 对 bArr 的读取用了缓冲,能成功的机器上肯定在关闭 MsgBox 前将 wav 完全读取到播放缓冲区,所以清除 bArr 不影响播放;播放缓冲区大小可能和机器内存或媒体播放器的设置有关,可以比较一下。
[解决办法]
没有测试,所以不是很确定。估计是与机器内存大小有关。

在模块级和过程级定义的变量是有差别的。过程级的变量在过程执行后建立在堆栈中,而模块级的变量好像是在进程数据段建立的,由此可以更好地利用虚拟内存的磁盘交换。

对于很大的缓冲区变量,我不主张在过程中频繁地临时创建和销毁。
[解决办法]
建议版主删除楼上的拉垃贴。
[解决办法]
呵呵,楼主所说的这个情况我也遇到过,我在家里和学校不同的机器上试确实会得出不同的效果,我也一直纳闷呢!

热点排行