win2000下为什么不能用这个api函数?

windflow 2002-08-31 05:45:34
AVIFileOpen是VFW下的一个函数,用来打开avi文件,可是我用它的时候却出现了怪问题,相同的程序,相同的avi文件,在win98中程序运行正常,但在win2000中运行错误,打不开avi文件,哪位遇到过这种情况?
...全文
54 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
windflow 2002-09-01
  • 打赏
  • 举报
回复
请继续关注!这涉及到是delphi的跨平台问题还VFW的跨平台问题。
9igogo 2002-08-31
  • 打赏
  • 举报
回复
晕好长阿
windflow 2002-08-31
  • 打赏
  • 举报
回复
to smhpnuaa(农奴翻身感谢党) :
我就是用的这段代码,不知你在win2000里有没有试过,我是在很多个装win2000的机子上试过了,都不行。
上面这段代码还有个地方是错误的,必须修正才能编译通过。
我用的是delphi6。
ilang 2002-08-31
  • 打赏
  • 举报
回复
了解
smhpnuaa 2002-08-31
  • 打赏
  • 举报
回复
版本是不同的,2000下的GDI函数更新过的。下面是的AviFileOpen的例子

uses windows, graphics;

interface

const
streamtypeAUDIO : longint = $73647561;
streamtypeVIDEO : longint = $73646976;

type
TAVIStream = record
fccType : longint;
fccHandler : longint;
dwFlags : longint;
dwCaps : longint;
wPriority : word;
wLanguage : word;
dwScale : longint;
dwRate : longint;
dwStart : longint;
dwLength : longint;
dwInitialFrames : longint;
dwSuggestedBufferSize : longint;
dwQuality : longint;
dwSampleSize : longint;
rcFrame : TRect;
dwEditCount : longint;
dwFormatChangeCount : longint;
Name : array [0..64] of char;
end;

PAVIStream = ^TAVIStream;

PAVIFile = pointer;

TAVIFileInfo = record
dwMaxBytesPerSec : longint;
dwFlags : longint;
dwCaps : longint;
dwStreams : longint;
dwSuggestedBufferSize : longint;

dwWidth : longint;
dwHeight : longint;

dwScale : longint;
dwRate : longint;
dwLength : longint;

dwEditCount : longint;

szFileType : array[0..63] of char;
end;

PAVIFileInfo = ^TAVIFileInfo;

TAVIStreamInfo = record
fccType : longint;
fccHandler : longint;
dwFlags : longint;
dwCaps : longint;
wPriority : word;
wLanguage : word;
dwScale : longint;
dwRate : longint;
dwStart : longint;
dwLength : longint;
dwInitialFrames : longint;
dwSuggestedBufferSize : longint;
dwQuality : longint;
dwSampleSize : longint;
rcFrame : TRect;
dwEditCount : longint;
dwFormatChangeCount : longint;
szName : array[0..63] of char;
end;

PAVIStreamInfo = ^TAVIStreamInfo;

function AVIFileOpen(avifile : pointer; filename : pchar; mode : integer;
CLSID : pointer) : integer; stdcall; external 'avifil32.dll' index 16;

function AVIFileRelease(avifile : pointer) : longint; stdcall; external 'avifil32.dll' index 20;

function AVIFileGetStream(avifile : pointer; avistream : PAVIStream;
streamtype : longint; lParam : longint) : integer; stdcall; external 'avifil32.dll' index 11;

function AVIStreamGetFrameOpen(avistream : PAVIStream; bitmapwanted : pointer) : pointer; stdcall; external 'avifil32.dll' index 42;

procedure AVIStreamGetFrameClose(pget : pointer); stdcall; external 'avifil32.dll' index 41;

function AVIStreamGetFrame(getframe : pointer; position : longint) : pointer; stdcall; external 'avifil32.dll' index 40;

procedure AVIStreamRelease(avistream : PAVIStream); stdcall; external 'avifil32.dll' index 53;

function AVIStreamInfo(pstream : PAVIStream; psi : PAVISTREAMINFO; lsize : longint) : integer; stdcall; external 'avifil32.dll' index 44;

function GetAviFrame(AviFilename : String; Index: Integer; var bmp: TBitmap): boolean;

implementation

function GetAviFrame(AviFilename : String; Index: Integer; var bmp: TBitmap): boolean;
var
FAviFile : Pointer;
FVideoStream : Pointer;
FGetFrame : Pointer;
info : TAVIStreamInfo;
FFrameWidth, FFrameHeight : Integer;
FStartFrame, FStopFrame : Integer;
image : PBitmapInfoHeader;
imagestart : Integer;
begin
result := false;
if (AVIFileOpen(@favifile, pchar(AviFileName), 0, nil) <> 0) then
exit;

if (AVIFileGetStream(favifile, @fvideostream, streamtypeVIDEO, 0) <> 0) then
begin
AVIFileRelease(favifile);
exit;
end;

AVIStreamInfo(fvideostream, @info, sizeof(info));
with info do
begin
fFrameWidth := rcframe.right - rcframe.left;
fFrameHeight := rcframe.bottom - rcframe.top;
fStartFrame := dwStart;
fStopFrame := dwLength - 1;
end;

if (index <fstartframe) or (index > fstopframe) then
begin
AVIStreamRelease(fvideostream);
AVIFileRelease(favifile);
exit;
end;

fgetframe := AVIStreamGetFrameOpen(fvideostream, nil);
if (fgetframe = nil) then
begin
AVIStreamRelease(fvideostream);
AVIFileRelease(favifile);
exit;
end;

image := AVIStreamGetFrame(fgetframe, Index);
if assigned(image) then
begin
if not assigned(bmp) then
begin
bmp := tbitmap.create;
bmp.width := fframewidth;
bmp.height := fframeheight;
end
else if bmp.empty then
begin
bmp.width := fframewidth;
bmp.height := fframeheight;
end;
imagestart := image^.biSize + image^.biClrUsed * 4;
StretchDIBits(bmp.canvas.handle, 0, 0, bmp.width, bmp.height,
0, 0, fframewidth, fframeheight,
pchar(image) + imagestart,
TBitmapInfo(image^), 0, SRCCOPY);
result := true;
end;

AVIStreamGetFrameClose(fgetframe);
AVIStreamRelease(fvideostream);
AVIFileRelease(favifile);
end;

end.

1,184

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧