以下是源代码: 当加上这句后程序就出错
   SendMessage(hWndC, WM_CAP_SET_CALLBACK_FRAME,0,LongInt(@FrameCallBack));我是照书上抄的例子,FrameCallBack:这个是帧的回调过程
unit Unit1;interfaceuses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls,VFW;type
  TForm1 = class(TForm)
    PnV1: TPanel;
    PnV2: TPanel;
    Button1: TButton;
    Button2: TButton;
    Memo1: TMemo;
    procedure FormCreate(Sender: TObject);
    procedure FormClose(Sender: TObject; var Action: TCloseAction);
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
    dc:HDC;
    hdd:HDRAWDIB;
    BmpInfo,BmpInfo1:BITMAPINFO;
    hWndc:Thandle;
    Data:Pchar;
    procedure SetBmpInfo1();
    procedure ShowDib();
     
  end;var
  Form1: TForm1;
  //function FrameCallBack(hWnd:HWND;lpVHdr:LongInt):boolean;stdcall;  
   function FrameCallBack(hWnd:HWND;lpVHdr:LongInt):boolean;stdcall;
implementation{$R *.dfm}{ TForm1 }procedure TForm1.SetBmpInfo1;
begin
  BmpInfo1.bmiHeader.biSize:=sizeof(BITMAPINFO);
  BmpInfo1.bmiHeader.biWidth:=176;
  BmpInfo1.bmiHeader.biHeight:=144;
  BmpInfo1.bmiHeader.biPlanes:=1;
  BmpInfo1.bmiHeader.biBitCount:=12;
  BmpInfo1.bmiHeader.biCompression:=808596553;
  BmpInfo1.bmiHeader.biSizeImage:=38016;
  BmpInfo1.bmiHeader.biXPelsPerMeter:=176;
  BmpInfo1.bmiHeader.biYPelsPerMeter:=144;
  BmpInfo1.bmiHeader.biClrUsed:=0;
  BmpInfo1.bmiHeader.biClrImportant:=0;  
end;procedure TForm1.ShowDib;
begin
  DrawDibDraw(hdd,dc,0,0,PnV2.Width,PnV2.Height,addr(BmpInfo1),Data,0,0,-1,-1,0);
end;function FrameCallBack(hWnd:HWND;lpVHdr: Integer):boolean;stdcall;
var
  VideoStr:PVIDEOHDR;
  nn:Integer;
begin
  VideoStr:=PVIDEOHDR(lpVHdr);
  nn:=VideoStr^.dwBufferLength;
  CopyMemory(form1.Data,VideoStr^.lpData,nn);
  form1.ShowDib();
  Result:=true;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
  self.SetBmpInfo1();
  dc:=GetDC(PnV2.Handle);
  hdd:=DrawDibOpen();
  if hdd=null then
     memo1.Lines.add('no hdd');
     GetMem(Data,140000);
end;procedure TForm1.FormClose(Sender: TObject; var Action: TCloseAction);
begin
  if hWndc<>0 then
    begin
       SendMessage(hWndc,WM_CAP_DRIVER_DISCONNECT,0,0);
    end;
  FreeMem(Data);
  DrawDibClose(hdd);  
end;procedure TForm1.Button1Click(Sender: TObject);
var
  nn:integer;
  dwSize:DWORD;
  
begin
   hWndC:=capCreateCaptureWindowA('Capture Window',WS_CHILD or WS_VISIBLE,PnV1.Left,PnV1.Top,PnV1.Width,PnV1.Height,form1.Handle,0);
   if hWndc<>0 then
     begin
      SendMessage(hWndC, WM_CAP_SET_CALLBACK_VIDEOSTREAM, 0,0);
      SendMessage(hWndC, WM_CAP_SET_CALLBACK_ERROR, 0, 0);
      SendMessage(hWndC, WM_CAP_SET_CALLBACK_STATUSA, 0, 0);
      SendMessage(hWndC, WM_CAP_DRIVER_CONNECT, 0, 0);
      SendMessage(hWndC, WM_CAP_SET_SCALE, 1, 0);
      SendMessage(hWndC, WM_CAP_SET_PREVIEWRATE, 80, 0);
      SendMessage(hWndC, WM_CAP_SET_CALLBACK_FRAME,0,LongInt(@FrameCallBack));      SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0);
      SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0);      dwSize:=capGetVideoFormatSize(hWndC);
      capGetVideoFormat(hWndC, Addr(BmpInfo), dwSize);
      nn:=BmpInfo.bmiHeader.biWidth;
      Memo1.Lines.Add('width='+IntToStr(nn));
      nn:=BmpInfo.bmiHeader.biXPelsPerMeter;
      Memo1.Lines.Add('biXPelsPerMeter='+IntToStr(nn));
      nn:=BmpInfo.bmiHeader.biHeight;
      Memo1.Lines.Add('height='+IntToStr(nn));
      nn:=BmpInfo.bmiHeader.biYPelsPerMeter;
      Memo1.Lines.Add('biYPelsPerMeter='+IntToStr(nn));
      nn:=BmpInfo.bmiHeader.biBitCount;
      Memo1.Lines.Add('biBitCount='+IntToStr(nn));
      nn:=BmpInfo.bmiHeader.biSizeImage;
      Memo1.Lines.Add('biSizeImage='+IntToStr(nn));
     end;
end;procedure TForm1.Button2Click(Sender: TObject);
begin
  if hWndC <> 0 then
  begin
    SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
    hWndC := 0;
  end;
end;end.

解决方案 »

  1.   

    将FrameCallBack改成这样:
    function FrameCallBack(hWnd:HWND;lpVHdr: PVIDEOHDR):boolean;stdcall;
    begin
      with Form1 do
      begin
        DrawDibDraw(hdd,
          dc,
          0,
          0,
          PnV2.Width,
          PnV2.Height,
          @BmpInfo.bmiHeader,
          lpVHdr^.lpData,
          0,
          0,
          -1,
          -1,
          0);
      end;
      Result:=true;
    end;CSDN论坛浏览器:http://CoolSlob.ys168.com/
      

  2.   

    在Delphi7, Windows2003 SP1调试通过。CSDN论坛浏览器:http://CoolSlob.ys168.com/
      

  3.   

    压缩
    ICCompressBegin
    ICCompress
    ICCompressEnd
    解压
    ICDecompressBegin
    ICDecompress
    ICDecompressEnd ICOpen(icInfo.fccType, icInfo.fccHandler, ICMODE_QUERY);
    得到HIC列表
    ICGetInfo得到HIC列表详细信息,设置好输出格式,就可以了