一个简单的程序:主窗口调用一个子窗口,子窗口放了一个TWindowsMediaPlayer(从System32\wmp.dll安装的ActiveX控件,相信很多人用过这个多媒体播放控件),当我关闭并释放子窗口时,经常会出错由wmp.dll引起的内存错误,大概是访问了不合法的内存地址。这个错误并不是每次都发生,在播放的媒体内容相同的情况下进行多次测试,一般十次有一次出错,运气不好时第一次就出错。
有没有人遇到过类似问题?帮帮忙啦
我用的是Delphi7,Windows Media Player 版本是9,10的也设过,同样出错。

解决方案 »

  1.   

    ??怎么有回复在这里看不到??好在进入管理可以看得见
    原代码很简单,基本没有什么原码,就是:
    放一个TWindowsMediaPlayer控件,
    设置属性iuMode为none,属性enableContextMenu为False,
    在子窗口Close事件中,Action=caFree;主窗口有一个按钮,点击就创建子窗口,在创建子窗口后,WindowsMediaPlayer1.URL='媒体文件名';当不断点按钮创建子窗口并关闭子窗口时,有时候关闭子窗口就出错了。
    很容易就可以写出程序来测试的,我用几台机试过,回家用家里的电脑也试过都出现这个问题。说跟踪这种问题真不知道怎样跟踪,不是每次都出现,而且错误估计是在窗口释放之后的,程序应该是捕捉不到的。
      

  2.   

    对了,测试环境没有装卡巴斯基,有些电脑甚至什么杀毒软件都没装。
    估计是控件释放时,wmp内核播放未完全停止,并且访问已释放的内存。
    我在释放之前进行WindowsMediaPlayer1.controls.stop;并等待一段时间,仍然会出错,这就不明白了。
      

  3.   

    to: zzflover
    你是不是用Delphi呢,你是关闭窗口后声音仍在吗?如果是,可能是你没有释放窗口,窗口只是隐藏了,媒体还在后台播放,当然有声音
      

  4.   

    能否试着在子窗口中动态生成TWindowsMediaPlayer控件,在该子窗口的TForm2.FormClose(Sender: TObject)中释放掉该控件:TWindowsMediaPlayer.Free;
      

  5.   

    to: dl110
    动态生成也试过,是一样的。
    我想与动态生成或设计时生成无关,应该还是控制释放有关,估计是释放和内核的停止和释放不协调有关,只是不知怎样处理。
    有时候,错误使得整个程序出现严重错误关闭
      

  6.   

    试试手动创建TWindowsMediaPlayer对象,创建是用TWindowsMediaPlayer.Create(nil);窗体释放是再释放TWindowsMediaPlayer试试
      

  7.   

    大家帮想想办法吧,难道就没人做过简单的播放程序,或使用过TWindowsMediaPlayer??
      

  8.   

    在你调用dll的工程文件dpr中引用ShareMem就可以了。看下面的:
    http://blog.csdn.net/findwo/archive/2008/03/19/2196693.aspx
      

  9.   

    to: bds248
      有些启发,学到了些东西,但我的这个问题可能解决不了,我这里的dll是windows再的媒体播放器的wmp.dll,无法修改,而且我的出错是偶然的,并不是每次都出错,我测试过很多,一可能说都是播放过媒体后,释放就有问题to: supercc
      其实这个控件用起来一点也不麻烦,倒是d自带的TMediaPlayer很难用,又不好控制