我在程序中打开了一个音频文件,使用完毕后,我需要对她关闭后在做别的操作,但是不知道为什么死活都关不掉,老是提示我被别的程序占用,有什么办法强制关闭她呀!!!我得代码如下:
function TCMPlayWave.OpenFileName(Name: PChar; Draw: Boolean): Boolean;
var
  mmckinfoParent, mmckinfoSubchunk: MMCKINFO;//音频信息头
  dwfmtSize: DWORD;
  DrawAll: TDrawWave_Type;      //波形结构体
begin
  Self.MODInt := 0;
  Self.PlaySize := 0;  //打开音频文件                  只读       以缓冲区方式打开
  Self.hio := mmioOpen(Name, NIL, MMIO_READ or MMIO_ALLOCBUF);
  if Self.hio = 0 then
     raise EMMIO.Create('打不开文件或文件不存在!');  Try
    //寻找 RIFF 块的类型标志,以确定是 WAV 文件
    mmckinfoParent.fccType := mmioStringToFOURCC('WAVE', 0);
    if mmioDescend(Self.hio, @mmckinfoParent, NIL, MMIO_FINDRIFF) <> 0 then
       raise EMMIO.Create('不是WAVE文件!');    //寻找 fmt 子块,以确定是 WAV 文件并找出一些音频文件的数据
    mmckinfoSubchunk.ckid := mmioStringToFOURCC('fmt', 0);
    if mmioDescend(Self.hio, @mmckinfoSubchunk, @mmckinfoParent, MMIO_FINDCHUNK) <> 0 then
       raise EMMIO.Create('不是WAVE文件!');    //音频信息头的大小
    dwFmtSize := mmckinfoSubchunk.cksize;
    //锁定内存
    Self.hFormat := LocalAlloc(LMEM_MOVEABLE, LOWORD(dwFmtSize));
    if Self.hFormat = 0 then
       raise EMMIO.Create('不能分配内存!');    try               //开辟内存
      Self.pFormat := PWAVEFORMATEX(LocalLock(Self.hFormat));
      if Self.pFormat = NIL then
         raise EMMIO.Create('不能锁定内存!');      //读取音频信息头( 音频格式 )
      if mmioRead(Self.hio, PChar(Self.pFormat), dwFmtSize) <> LongInt(dwFmtSize) then
         raise EMMIO.Create('读格式错!');      //确定是否为指定格式类型
      if Self.pFormat^.wFormatTag <> WAVE_FORMAT_PCM then
         raise EMMIO.Create('波形音频不是PCM格式音频!');      //打开音频输出设备
      if WaveOutOpen(@Self.hwo, WAVE_MAPPER, Self.pFormat, 0, 0, WAVE_FORMAT_QUERY) <> 0 then
         raise EMMIO.Create('波形音频输出设备不支持该格式!');      //把文件指针移到 data 数据块的开始处
      mmioAscend(Self.hio, @mmckinfoSubchunk, 0);      //查找 data 数据块
      mmckinfoSubchunk.ckid := mmioStringToFOURCC('data', 0);
      if mmioDescend(Self.hio, @mmckinfoSubchunk, @mmckinfoParent, MMIO_FINDCHUNK) <> 0 then
         raise EMMIO.Create('找不到数据块!');      //音频数据的长度
      Self.DataLength := mmckinfoSubchunk.cksize;      if Self.DataLength = 0 then
      begin             //音频数据的长度为0
         LocalUnlock(Self.hFormat);     //解锁内存块
         LocalFree(Self.hFormat);       //释放内存块
         mmioClose(Self.hio, 0);        //关闭文件
      end;
    Finally
    end;
  Finally
  end;  if Self.DataLength = 0 then
  begin
     with Self.FDesBMP do
     begin
        Canvas.Brush.Color := Self.DrawBackColor;
        Canvas.Brush.Style := bsSolid;
        Canvas.Pen.Color := Self.DrawLineColor;
        Canvas.Pen.Mode := pmCopy;
        Canvas.FillRect(Rect(0, 0, Self.FDrawWave.ClientWidth, Self.FDrawWave.ClientHeight));
     end;
     BitBlt(Self.FDrawWave.Canvas.Handle, 0, 0, Self.FDrawWave.ClientWidth,
            Self.FDrawWave.ClientHeight, Self.FDesBMP.Canvas.Handle, 0, 0, SRCCOPY);
     Application.MessageBox('文件长度为零!', '提示', MB_OK + MB_ICONINFORMATION);
     SendMessage(Application.MainForm.Handle, CM_ENDDRAW, 0, 0);
  end;  if (Self.FDrawWave <> NIL) AND (Self.FDesBMP <> NIL) AND Draw AND Self.FShowDrawWave
     and (Self.DataLength <> 0) then
  begin //画波形
    DrawAll.FileType := CS_SAVE_PLAY;           //播放方式
    DrawAll.hio := Self.hio;
    DrawAll.Flag := Integer(Self.DataLength) DIV 2 DIV Self.FDrawWave.ClientWidth + 1;
    if DrawAll.Flag <= 0 then DrawAll.Flag := 1;
    DrawAll.FileName := '';
    DrawAll.Length := Self.DataLength;
    DrawAll.DesCanvas := Self.FDrawWave.Canvas;
    DrawAll.DH := Self.FDrawWave.ClientHeight;
    DrawAll.DW := Self.FDrawWave.ClientWidth;
    DrawAll.DesBitMap := Self.FDesBMP;
    DrawAllWave(DrawAll, Self.WaveMin, Self.WaveMax, Self.FDrawLineColor, Self.FDrawBackColor);
  end;  Self.FCanUndo := False;       //不能进行撤消操作
  Result := True;               //打开成功
end;//-------------------------我用这种办法关闭,但是不行---------------------------
procedure TCMPlayWave.CloseWaveFile;
begin
  if NowPlay <> CPSTOPING then  //不是停止状态
     Exit;
  LocalUnlock(hFormat);  //解锁内存
  LocalFree(hFormat);    //释放音频信息头
   mmioClose(hio, 0);     //关闭音频输出设备
  Self.hio := 0;
  Self.DataLength := 0;
  FNowPlay := CPNONE;    //当前没有状态
end;

解决方案 »

  1.   

    procedure TCMPlayWave.CloseWaveFile;
    begin
      if NowPlay <> CPSTOPING then  //不是停止状态
         Exit;
      LocalUnlock(hFormat);  //解锁内存
      LocalFree(hFormat);    //释放音频信息头
       mmioClose(hio, 0);     //关闭音频输出设备
      Self.hio := 0;
      Self.DataLength := 0;
      FNowPlay := CPNONE;    //当前没有状态
      sendmessage(handle,wm_close,0,0) //-----------------------------不知道行不行
    end;
      

  2.   

    我在程序中打开了一个音频文件,使用完毕后,我需要对她关闭后在做别的操作,但是不知道为什么死活都关不掉,老是提示我被别的程序占用,有什么办法强制关闭她呀!!!// 你确保使用完毕后 没有其他冬冬在使用他么用完了 请 CloseHandle(fileHandle)/ Close;由于文件的被引用数还没有变为0 当然不能关闭..