Hallo,
ich mach hier gerade fremden Code flott... Ich hab mir von torry.net
Compressed AVI Read/Write Units geladen.
Und da passiert folgendes:
Delphi-Quellcode:
//definitionen
pavis: PAVIStream = Pointer;
IAVIStream = interface(IUnknown)
...
end;
function AVIStreamEnd(pavi: IAVISTREAM): LONG;
Ending:=AVIStreamENd(pavis); //hier knallts
Ich habe den aufruf mal durch das hier ersetzt:
Ending:=AVIStreamEnd(IAVIStream(pavis^));
Und habe jetzt folgenden Code:
Delphi-Quellcode:
procedure TForm2.BOpenAVIClick(Sender: TObject);
begin
with TOpenDialog.Create(
nil)
do
try
Filter := '
Audio/Video Interlaced File (*.avi)|*.avi';
if Execute
then
begin
MainAVI.Start := 0;
MainAVI.Ending := 1;
MainAVI.Open(FIleName);
end;
finally
Free;
end;
end;
procedure TForm2.FormCreate(Sender: TObject);
begin
GetMem(Buffer, 1024);
//nur mal auf Verdacht alloziiert, wegen der AV, ändert aber nix - Buffer: Pointer, als Form-Member deklariert.
MainAVI := TAVIReader.Create(Buffer);
end;
Was allerdings sehr merkwürdig ist:
Delphi-Quellcode:
function TAVIReader.Open(AFileName: String): integer;
begin
FileName := AFileName;
result := AVIFileOpen(pavi, Pchar(Filename), OF_READ, nil);
AVIFILEGetStream(pavi,pavis,streamtypeVIDEO,0); //hier
Start:=AVIStreamStart(pavis);
Ending:=AVIStreamEnd(IAVIStream(pavis^));
ob:=AVIStreamGetFrameOpen(pavis,nil);
AVIStreamBeginStreaming(pavis,Start,Ending,1000);
// DrawDIBStart(han,microsperframe); //nicht von mir auskommentiert
end;
Wenn ich diese Funktion durchsteppe (Ich hab extra schon die optimierung ausgeschaltet), zeigt er mir, wenn ich bei "//hier" bin und auf "Eins weiter" klicke, das "end;" als nächste Anweisung - er überspringt mir also 4 Programmzeilen...
Das ganze kracht dann mit einer
Read bei 0 AV in "AVIFil32.dll" (eine Systemdll, glaub ich, das
PSDK gibt mir auch Auskunft über die Funktionen, die exportiert werden), nach kompletten durchsteppen (also nach dem end meines Buttonclickhandlers)
Also:
1. kann mir wer helfen
2. hat jemand ne andere freie AVI-Read/Write-Kompo da?