我写了一个bmp 转 avi 的过程,可以转成avi,但退出过程时会报错
   “Access violation at adress 00000000.Read of address 00000000”
   下面是代码,大家帮我看一下,哪出错了,是不是指针上的问题。
procedure TForm1.BmpToAvi(FileDir: string;Filedest:string);
var
  Sr:TSearchRec;
  FileAtr:integer;
  str:string;
  bFind:Integer;
  nFrames:integer;
//  hr:HRESULT;
  tmp_buf:pchar;  fp:hFile;
  StreamInfo:TAVISTREAMINFO;
  pFile:IAVIFILE;
  ps:IAVISTREAM;
  bmpFileHeader:BITMAPFILEHEADER;
  bmpInfoHeader:BITMAPINFOHEADER;
begin
  nFrames:=0;
  str:=FileDir+'*.*';
  AVIFileInit();  bFind:=FindFirst(str,faAnyFile,sr);
        while (bFind=0) do
          begin
            bFind:=FindNext(Sr);
            if (Sr.Name[1]<>'.') and (sr.Attr<>faDirectory) then
                begin                  str:=ExpandFileName(Sr.Name);
                  fp:=_lopen(pChar(str),OF_READWRITE);
                  //fp:=FileOpen(str,fmOpenWrite);                  _llseek(fp,0,FILE_BEGIN);
                  //FileSeek(fp,0,0);
                  _lread(fp,@bmpFileHeader,sizeof(bmpFileHeader));
                  //FileRead(fp,bmpFileHeader,sizeof(bmpFileHeader));
                  _lread(fp,@bmpInfoHeader,sizeof(BITMAPINFOHEADER));
                  //FileRead(fp,bmpInfoHeader,sizeof(BITMAPINFOHEADER));              //  tmp_buf:= nil;                  if (nFrames=0) then
                     begin
                       AVIFileOpen(pFile,PChar(Filedest),OF_WRITE or OF_CREATE,nil);
                       FillMemory(@StreamInfo,sizeof(StreamInfo),0);
                       StreamInfo.fccType:=streamtypeVIDEO;
                       StreamInfo.fccHandler := 0;
                       StreamInfo.dwScale := 1;
                       StreamInfo.dwRate := 15; // 15 fps
                       StreamInfo.dwSuggestedBufferSize := bmpInfoHeader.biSizeImage ;
                       SetRect(StreamInfo.rcFrame, 0, 0, bmpInfoHeader.biWidth, bmpInfoHeader.biHeight);
                       {hr :=} AVIFileCreateStream(pFile,ps,StreamInfo);
                     end;                   getmem(tmp_buf,bmpInfoHeader.biWidth * bmpInfoHeader.biHeight * 3);
                  //SetLength(tmp_buf,bmpInfoHeader.biWidth * bmpInfoHeader.biHeight * 3);                   _lread(fp,tmp_buf,bmpInfoHeader.biWidth * bmpInfoHeader.biHeight * 3);
                   //FileRead(fp,tmp_buf,bmpInfoHeader.biWidth * bmpInfoHeader.biHeight * 3);
                   {hr :=} AVIStreamSetFormat(ps,nFrames,@bmpInfoHeader,sizeof(bmpInfoHeader));                   {hr :=} AVIStreamWrite(ps, // stream
                                       nFrames , // time of this frame
                                       1, // number to write
                                       tmp_buf,
                                       bmpInfoHeader.biSizeImage , // size of this frame
                                       AVIIF_KEYFRAME, // flags....
                                       Nil,
                                       Nil);
                   nFrames:=nFrames+1;
                   freemem(tmp_buf);
                   _lclose(fp);
                   //FileClose(fp);
                   //freemem(tmp_buf);
                end;
          end;
  if (ps<>nil) then
     begin
     AVIStreamClose(ps);
     end;  if (pfile <> nil) then
     begin
     AVIFileRelease(pfile);
     end;//tmp_buf:=nil;   
  AVIFileExit();
end;
   
   各位兄弟劳神看一下,如果有现成的代码,发过来参考一下就感激不尽了