unit Video;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Buttons, ExtCtrls;type
TFrm_Video = class(TForm)
Panel1: TPanel;
Bit_Start: TSpeedButton;
Bit_Stop: TSpeedButton;
Bit_SnapShot: TSpeedButton;
SaveDialog1: TSaveDialog;
procedure FormCreate(Sender: TObject);
procedure Bit_StartClick(Sender: TObject);
procedure Bit_StopClick(Sender: TObject);
procedure Bit_SnapShotClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; Procedure vShowForm(h:THandle);stdcall;var
Frm_Video: TFrm_Video;implementation{$R *.dfm}const WM_CAP_START = WM_USER;
const WM_CAP_STOP = WM_CAP_START + 68;
const WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;
const WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11;
const WM_CAP_SAVEDIB = WM_CAP_START + 25;
const WM_CAP_GRAB_FRAME = WM_CAP_START + 60;
const WM_CAP_SEQUENCE = WM_CAP_START + 62;
const WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20;
const WM_CAP_SEQUENCE_NOFILE =WM_CAP_START+ 63 ;
const WM_CAP_SET_OVERLAY =WM_CAP_START+ 51 ;
const WM_CAP_SET_PREVIEW =WM_CAP_START+ 50 ;
const WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START +6;
const WM_CAP_SET_CALLBACK_ERROR=WM_CAP_START +2;
const WM_CAP_SET_CALLBACK_STATUSA= WM_CAP_START +3;
const WM_CAP_SET_CALLBACK_FRAME= WM_CAP_START +5;
const WM_CAP_SET_SCALE=WM_CAP_START+ 53 ;
const WM_CAP_SET_PREVIEWRATE=WM_CAP_START+ 52 ;
function capCreateCaptureWindowA(lpszWindowName : PCHAR;dwStyle : longint;
x : integer;
y : integer;
nWidth : integer;
nHeight : integer;
ParentWin : HWND;
nId : integer): HWND;
STDCALL EXTERNAL 'AVICAP32.DLL';Var hWndC : THandle;
CapturingAVI : bool;Procedure vShowForm(h:THandle);stdcall;
begin
Application.Handle := h;
With TFrm_Video.Create(Application) Do
Show;
end;procedure TFrm_Video.FormCreate(Sender: TObject);
begin
CapturingAVI := false;
hWndC := 0;
SaveDialog1.Options := [ofHideReadOnly, ofNoChangeDir, ofPathMustExist];
end;procedure TFrm_Video.Bit_StartClick(Sender: TObject);
begin
hWndC := capCreateCaptureWindowA('My Own Capture Window',
WS_CHILD or WS_VISIBLE ,
Panel1.Left,
Panel1.Top,
Panel1.Width,
Panel1.Height,
Frm_Video.Handle,
0);
if hWndC <> 0 then
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, 66, 0);
//SendMessage(hWndC, WM_CAP_SEQUENCE_NOFILE, 1, 0);
SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0);
SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0);
Bit_Start.Enabled :=false;
end;procedure TFrm_Video.Bit_StopClick(Sender: TObject);
begin
if hWndC <> 0 then begin
SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
hWndC := 0;
Bit_Start.Enabled :=true;
end;
end;procedure TFrm_Video.Bit_SnapShotClick(Sender: TObject);
begin
if hWndC <> 0 then begin
SaveDialog1.DefaultExt := 'bmp';
SaveDialog1.Filter := 'Bitmap files (*.bmp)|*.bmp';
if SaveDialog1.Execute then
SendMessage(hWndC,
WM_CAP_SAVEDIB,
0,
longint(pchar(SaveDialog1.FileName)));
end;
end;end.
把他做成DLL然后调用。
单击"开始"按钮后报错:Access violation at address 0112D0F7 in module 'videocap.dll',Read of address 00000180.
为什么会这样,我如果不把他做成DLL的调用的时候就没有问题了。
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Buttons, ExtCtrls;type
TFrm_Video = class(TForm)
Panel1: TPanel;
Bit_Start: TSpeedButton;
Bit_Stop: TSpeedButton;
Bit_SnapShot: TSpeedButton;
SaveDialog1: TSaveDialog;
procedure FormCreate(Sender: TObject);
procedure Bit_StartClick(Sender: TObject);
procedure Bit_StopClick(Sender: TObject);
procedure Bit_SnapShotClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end; Procedure vShowForm(h:THandle);stdcall;var
Frm_Video: TFrm_Video;implementation{$R *.dfm}const WM_CAP_START = WM_USER;
const WM_CAP_STOP = WM_CAP_START + 68;
const WM_CAP_DRIVER_CONNECT = WM_CAP_START + 10;
const WM_CAP_DRIVER_DISCONNECT = WM_CAP_START + 11;
const WM_CAP_SAVEDIB = WM_CAP_START + 25;
const WM_CAP_GRAB_FRAME = WM_CAP_START + 60;
const WM_CAP_SEQUENCE = WM_CAP_START + 62;
const WM_CAP_FILE_SET_CAPTURE_FILEA = WM_CAP_START + 20;
const WM_CAP_SEQUENCE_NOFILE =WM_CAP_START+ 63 ;
const WM_CAP_SET_OVERLAY =WM_CAP_START+ 51 ;
const WM_CAP_SET_PREVIEW =WM_CAP_START+ 50 ;
const WM_CAP_SET_CALLBACK_VIDEOSTREAM = WM_CAP_START +6;
const WM_CAP_SET_CALLBACK_ERROR=WM_CAP_START +2;
const WM_CAP_SET_CALLBACK_STATUSA= WM_CAP_START +3;
const WM_CAP_SET_CALLBACK_FRAME= WM_CAP_START +5;
const WM_CAP_SET_SCALE=WM_CAP_START+ 53 ;
const WM_CAP_SET_PREVIEWRATE=WM_CAP_START+ 52 ;
function capCreateCaptureWindowA(lpszWindowName : PCHAR;dwStyle : longint;
x : integer;
y : integer;
nWidth : integer;
nHeight : integer;
ParentWin : HWND;
nId : integer): HWND;
STDCALL EXTERNAL 'AVICAP32.DLL';Var hWndC : THandle;
CapturingAVI : bool;Procedure vShowForm(h:THandle);stdcall;
begin
Application.Handle := h;
With TFrm_Video.Create(Application) Do
Show;
end;procedure TFrm_Video.FormCreate(Sender: TObject);
begin
CapturingAVI := false;
hWndC := 0;
SaveDialog1.Options := [ofHideReadOnly, ofNoChangeDir, ofPathMustExist];
end;procedure TFrm_Video.Bit_StartClick(Sender: TObject);
begin
hWndC := capCreateCaptureWindowA('My Own Capture Window',
WS_CHILD or WS_VISIBLE ,
Panel1.Left,
Panel1.Top,
Panel1.Width,
Panel1.Height,
Frm_Video.Handle,
0);
if hWndC <> 0 then
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, 66, 0);
//SendMessage(hWndC, WM_CAP_SEQUENCE_NOFILE, 1, 0);
SendMessage(hWndC, WM_CAP_SET_OVERLAY, 1, 0);
SendMessage(hWndC, WM_CAP_SET_PREVIEW, 1, 0);
Bit_Start.Enabled :=false;
end;procedure TFrm_Video.Bit_StopClick(Sender: TObject);
begin
if hWndC <> 0 then begin
SendMessage(hWndC, WM_CAP_DRIVER_DISCONNECT, 0, 0);
hWndC := 0;
Bit_Start.Enabled :=true;
end;
end;procedure TFrm_Video.Bit_SnapShotClick(Sender: TObject);
begin
if hWndC <> 0 then begin
SaveDialog1.DefaultExt := 'bmp';
SaveDialog1.Filter := 'Bitmap files (*.bmp)|*.bmp';
if SaveDialog1.Execute then
SendMessage(hWndC,
WM_CAP_SAVEDIB,
0,
longint(pchar(SaveDialog1.FileName)));
end;
end;end.
把他做成DLL然后调用。
单击"开始"按钮后报错:Access violation at address 0112D0F7 in module 'videocap.dll',Read of address 00000180.
为什么会这样,我如果不把他做成DLL的调用的时候就没有问题了。
解决方案 »
- 程序中数据库还原不能成功,在企业管理器中还原没有问题
- 如何获取浏览器标题及地址的问题
- 在一个buttonclick事件中我创建了Excel对象,然后会加载很多Excel档里面的资料,现在想做一个进度条用于显示加载进度,在状态栏实现,寻求帮助
- 急!Spcomm如何发送一下命令格式???
- delphi中ado如何动态连接数据库
- Self是代表窗体,如果本组件呢.
- 关于在多线程中用ADO连接数据库时,数据库连接释的问题。超难,超难。
- 有关adocommand参数的一个小问题?
- 高分求解!各位大侠:我有一款老式摄像头,现欲做为实时照片输入,但图像模糊。不知各位有何良策,能够弥补(如加入其他设备,或程序上)。
- URLDownloadToFile下载网络文件 经常卡死不动 如何设置超时 继续下载下一个文件
- win2000 ODBC驱动程序全部损坏,安装MDAC2.8无效?
- 呵呵,晕啊,我领导要一个对比照片的程序,要把一堆照片里的相同照片找出来(不同文件名的,而且有几千张)!!!
有问题
因为DLL中的Application和程序中的对象不一致