Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Multimedia (https://www.delphipraxis.net/16-multimedia/)
-   -   Delphi AVI aus einer DLL (https://www.delphipraxis.net/12781-avi-aus-einer-dll.html)

xavior 4. Dez 2003 06:06


AVI aus einer DLL
 
HiHo ( :xmas: ), also ich hab ein kleines Problem, ich wollte mit Hilfe der Code-Library eine DLL-Datei erstellen ([cl]Library: Grafik / Sound / Multimedia[/cl]), das hat ja auch geklappt, und zwar so (Für andere die sowas auch machen möchten erklär ich mal den Anfang, mit dem Rest müsst ihr selbst klarkommen, da ich wie man's sieht nicht weiter weis :warn: ):

Eine Datei Names "MData32.rc" mit folgendem Inhalt erstellt :coder: :

Delphi-Quellcode:
ERDEDSDR AVIRES "Erde.avi"
HUNDDLAE AVIRES "Hund.avi"
WARTENEI ANIRES "Wart.ani"
ENDEAUSM ANIRES "Ende.ani"
HAHAHAHA WAVRES "Lach.wav"
ICHLPLAN WAVRES "Plan.wav"
SCHWULOD WAVRES "Schw.wav"
TERMINAT WAVRES "Term.wav"
WATWERBI WAVRES "Watw.wav"
LOGOMFIR BMPRES "Logo.bmp"
MAINICON SYMBOL "Logo.ico"
Dann habe ich unter Neu -> Weiter -> DLL-Experte ausgewählt und denn code volgendermaßen verändert :coder: :

Delphi-Quellcode:
library MData32;

{$R 'MData32.res' 'MData32.rc'}
{$R *.res}

begin
end.
Beim Compilieren hatt Delphi dann eine Datei Names "MData32.dll" erstellt. Jetzt frage ich mich :gruebel: aber, wie man diese Datei einbindet un z.B.: auf Die 'ERDEDSDR AVIRES "Erde.avi"' zugreift um sie in einem TAnimate Rahmen darzustellen ?!? So bis heute Abend dann, wäre über jede mögliche Lösung erfreut! :thuimb:

Luckie 4. Dez 2003 06:32

Re: AVI aus einer DLL
 
Die Units kannst du aus der DLL rausschmeißen.

Dann kuck dir in der Hilfe mal die Klasse TResourceStream an, damit sollte sich schon was anfangen lassen.

xavior 4. Dez 2003 10:49

Re: AVI aus einer DLL
 
Welche Units den ???

:wiejetzt: :gruebel:

Nalincah 4. Dez 2003 10:54

Re: AVI aus einer DLL
 
Wahrscheinlich diese hier:

Delphi-Quellcode:
uses
  SysUtils,
  Classes;

xavior 4. Dez 2003 11:04

Re: AVI aus einer DLL
 
OK hab ich jetzt gemacht! Aber das beantwortet noch immer nich meine Frage! Wie stell ich das den jetzt an das ich die 'ERDEDSDR AVIRES "Erde.avi"' laden und abspielen kann? OK, mit TResourceStream, aber ich weis ja garnicht wo ich anfangn soll!!

scp 4. Dez 2003 11:21

Re: AVI aus einer DLL
 
Da gibt es zwei Möglichkeiten:

Delphi-Quellcode:
FModuleHandle := LoadLibraryEx(PChar(FFileName), 0, LOAD_LIBRARY_AS_DATAFILE);

    AnimateV.CommonAVI := aviNone;

    AnimateV.ResHandle := FModuleHandle; // Hier die Exception

    If (StrToIntDef(Name, 0) <> 0) then
      AnimateV.ResID := StrToIntDef(Name, 0)
    else
      AnimateV.ResName := Name;

    AnimateV.Seek(1);
    AnimateV.Play(1, AnimateV.FrameCount, 0);
Delphi-Quellcode:
FModuleHandle := LoadLibraryEx(PChar(FFileName), 0, LOAD_LIBRARY_AS_DATAFILE);

    AnimateV.CommonAVI := aviNone;

    If (StrToIntDef(Name, 0) <> 0) then
      SendMessage(AnimateV.Handle, ACM_OPEN, FModuleHandle, StrToIntDef(Name, 0))
    else
      SendMessage(AnimateV.Handle, ACM_OPEN, FModuleHandle, Integer(@Name[1]));

    SendMessage(AnimateV.Handle, ACM_PLAY, -1, MAKELONG(0, Word(-1)));
Die obere ist die eigentlich korrekte Vorgehensweise. Da dies zumindest bei mir manchmal nicht funktioniert, verwende ich die untere Methode.

xavior 4. Dez 2003 11:33

Re: AVI aus einer DLL
 
OK danke, aber jetzt kommt bei mir diese Meldung: 'AVI kann nicht geöffnet werden' :wall: und das Programm kackt ab! Wie kann ich eigetlich die Position der AVI bestimmen z.B.: bei Erde.avi ?

Ich hab den Sourcecode folgendermaßen verändert:

Delphi-Quellcode:

 FModuleHandle := LoadLibraryEx(PChar('MData32.dll'), 0, LOAD_LIBRARY_AS_DATAFILE);
 Hund.CommonAVI := aviNone;
 Hund.ResHandle := FModuleHandle; // Hier die Exception    <---- Hier kommt der Fehler
{If (StrToIntDef(Name, 0) <> 0) then
  Hund.ResID := StrToIntDef(Name, 0)
 else
  Hund.ResName := Name;
  Hund.Seek(1);
  Hund.Play(1, Hund.FrameCount, 0);  }

scp 4. Dez 2003 11:50

Re: AVI aus einer DLL
 
Zitat:

Zitat von xavior
Hund.ResHandle := FModuleHandle; // Hier die Exception <---- Hier kommt der Fehler
[/delphi]

Was ist der Unterschied zwischen einem Fehler und einer Exception? Es gibt keinen.

Nein, im Ersnt ich hatte ja geschrieben, das die obere Version aus irgendeinem Grund nicht immer klappt, deswegen habe ich ja zwei Beispiele gegeben. Das unter funktioniert immer, allerdings muss man auf den Komfort der Komponente verzichten.

xavior 4. Dez 2003 12:08

Re: AVI aus einer DLL
 
Achso, dann versuch ich das untere! Aber, was sind ACM_OPEN & ACM_PLAY für Variablen? Und wie kan ich die Position der Datei bestimmen, wenn ich (z.B.: in meinem Fall) mehrer sachen in der DLL habe? :gruebel:

xavior 4. Dez 2003 12:59

Re: AVI aus einer DLL
 
Hallo?

scp 4. Dez 2003 13:04

Re: AVI aus einer DLL
 
Bei dem Beispiel ist überall "Name" zu finden. Dies ist ein String, der den Namen der Resource enthält, also für Hund.avi wäre das nach deiner Liste dann 'HUNDDLAE'.

scp 4. Dez 2003 13:09

Re: AVI aus einer DLL
 
Achso... ACM_OPEN & ACM_PLAY sind Variablen für Windows Messages, die in der Unit CommCtrl (nicht zu verwechseln mit ComCtrls!) definiert sind, die musste dann noch in die uses setzen.

xavior 4. Dez 2003 13:14

Re: AVI aus einer DLL
 
OK, das hab ich jetzt kapiert und hab es auch verändert, aber die AVI wird trozdem noch nicht abgespielt!

Delphi-Quellcode:

 procedure TSplash.Start(Sender: TObject);
var crMyCursor: TCursor;
    FModuleHandle: Hinst;
    ResStre: TResourceStream;
    ACM_OPEN, ACM_PLAY: Cardinal;
begin
 StartZeit   := Now;
 Zeit.Enabled := True;
 Screen.Cursors[crMyCursor] := LoadCursorFromFile('ANI\Wart.ani');
 Fortschritt.Cursor := crMyCursor;
 Splash.Cursor := crMyCursor;
 Hund.Cursor  := crMyCursor;
 FModuleHandle := LoadLibraryEx(PChar('MData32.dll'), 0, LOAD_LIBRARY_AS_DATAFILE);
 Hund.CommonAVI := aviNone;
 If (StrToIntDef('HUNDDLAE', 0) <> 0) then
  SendMessage(Hund.Handle, ACM_OPEN, FModuleHandle, StrToIntDef('HUNDDLAE', 0))
 else
  SendMessage(Hund.Handle, ACM_OPEN, FModuleHandle, Integer(@'HUNDDLAE'[1]));
  SendMessage(Hund.Handle, ACM_PLAY, -1, MAKELONG(0, Word(-1)));
  {Hund.Active := True;} <--------------------- Wenn ich das aktiviere, dann gibt es Fehler
end;

scp 4. Dez 2003 13:19

Re: AVI aus einer DLL
 
Oh, ich seh grad:
Code:
ERDEDSDR AVIRES "Erde.avi"
sollte so aussehen

Code:
ERDEDSDR AVI "Erde.avi"
also überall wo AVIRES steht muss eigentlich AVI stehen.

Delphi-Quellcode:
Hund.Active := True
Du darfst bei der zweiten Methode keine Eigentschaften der Kompo verwenden, es geht alles nur über SendMessage().

xavior 4. Dez 2003 13:30

Re: AVI aus einer DLL
 
:hello: :hello: :hello: :dancer: :dancer: :dancer: :cheers: :thuimb: :thuimb: :thuimb:

Endlich ich habs geschaft! Bei mir fällte oben der Eintrag
Delphi-Quellcode:
uses CommCtrl;
deswegen ging das nicht!

DANKE DANKE DANKE

xavior 4. Dez 2003 18:38

Ups
 
Ausversehen erstellt !

scp 5. Dez 2003 12:25

Re: AVI aus einer DLL
 
Habe noch ne simplere Möglichkeit gefunden:

Delphi-Quellcode:
  Hund : TAnimate;

//...

  try
    Hund.ResName := 'HUNDDLAE';
  except
  end;
  Hund.ResHandle := FModuleHandle;
Der Fehler wird abgefangen und nachdem auch das ResHandle gesetzt wurde, wird die AVI geladen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 23:01 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz