AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Neustrukturierung einer DLL

Ein Thema von EWeiss · begonnen am 5. Jul 2007 · letzter Beitrag vom 7. Jul 2007
Antwort Antwort
Seite 3 von 4     123 4   
EWeiss
(Gast)

n/a Beiträge
 
#21

Re: Neustrukturierung einer DLL

  Alt 6. Jul 2007, 15:48
Zitat von Ghostwalker:
Was logisch ist, da du nur den Destruktor aufrufst, aber das Objekt (in dem fall TComponent) nicht freigibst.

Delphi-Quellcode:
if Assigned(BASSVis1)then
  BASSVis1.free;

if Assigned(BASSWMPVis1) then
   BASSWMPVis1.free;



BTW...für was brauchst du da eine TComponent-Klasse ?
Klar stimmt .. schämmm

Ändert aber nichts an der tatsache das BASSWMPVis1.Destroy beim beenden
der Anwendung außerhalb von BassVis nicht aufgerufen wird.
Habe noch nicht rausfinden können an was das liegt.

Schön wäre gewesen wenn sich die class selbst zerstört wenn sie neu initialisiert wird.
In VB nehme ich NEW wird NEW aufgerufen zerstört sich die Klasse von selbst da nicht
zwei des gleichen typs gleichzeitig laufen können.
Hier muss man das alles manuel machen.

Ja benötigt man eigentlich nur wenn Controls bzw .. Form Objekte verwendet werden.
War mir aber nicht ganz sicher was ich nehmen soll.
Wie gesagt einige sachen muss ich noch lernen.

Alternativ könnte ich auch TThread anstelle von TComponent verwenden,.
Schaden tut es aber nicht

gruss Emil
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#22

Re: Neustrukturierung einer DLL

  Alt 6. Jul 2007, 16:16
Einfache Lösung:

Delphi-Quellcode:
  Procedure BASSVIS_QUIT;
  begin
    if Assigned(BASSVis1)then
       BASSVis1.free;
    if Assigned(BASSWMPVis1) then
      BASSWMPVis1.free;
  end;
Diese muß dann einfach beim beenden der Anwendung aufgerufen werden (Macht BASS selbst auch nicht anders )
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
Robert Marquardt
(Gast)

n/a Beiträge
 
#23

Re: Neustrukturierung einer DLL

  Alt 6. Jul 2007, 17:22
Na dann doch besser ein FreeAndNil(BASSVis1); und FreeAndNil(BASSWMPVis1); ohne irgendwelche IFs.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#24

Re: Neustrukturierung einer DLL

  Alt 7. Jul 2007, 01:36
@Ghostwalker
Zitat:
Aber dafür gibts ne einfach Lösung. Gib HVIS nicht nach außen und handle das intern selbst (globale Variable). Dazu noch eine, die dir sagt, welcher Art das aktuell laufende Plugin ist.
Geht nicht HVIS muss nach außen freigegeben werden.
Ist das VisHandle und wird von der Anwendung zur kontrolle über die Plugins benötigt.
Dann muss ich die ganze Lib umschreiben da zig Functionen diesen Parameter verwenden.

@Robert
Zitat:
Na dann doch besser ein FreeAndNil(BASSVis1); und FreeAndNil(BASSWMPVis1); ohne irgendwelche IFs.
Ist wohl sinnvoll denn ich prüfe ja über Assigned of die class nil ist.

gruss
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#25

Re: Neustrukturierung einer DLL

  Alt 7. Jul 2007, 05:02
Zitat:
Geht nicht HVIS muss nach außen freigegeben werden.
Ist das VisHandle und wird von der Anwendung zur kontrolle über die Plugins benötigt.
Dann muss ich die ganze Lib umschreiben da zig Functionen diesen Parameter verwenden.
Die Kontrolle der Plugins läuft ja ebenfalls über deine API. In dem du einen "Satz" Funktionen schreibst (Also nicht für jeden Plugintyp die Funktionen, sondern für alle Plugintypen die gleiche Funktionen), kannst du dir das rausgeben von HVIS sparen. Die Plugin-Unabhängigen Funktionen gibst du nach außen (exportierst du). Diese Funktionen machen nix anderes als deine Plugin-Abhängigen Funktionen aufzurufen. Da du intern weißt, welchen Plugintyp gerade aktiv ist und welches Handle das ist, brauchst du das nicht nach außen geben.

Du legst also, wie Robert schon vorgeschlagen hat, ein Superset der Pluginfunktionen an, das du exportierst. Dieses Superset wird exportiert (statt der bisherigen funktionen) und leitet letztendlich
alles an die entsprechenden Pluginfunktionen weiter.

Beispiel:

In der DLL:

Delphi-Quellcode:
   Procedure BASSVIS_PLAY; //diese Funktion wird exportiert !
   begin
     case globalkind of
        BASSVISKIND_SONIQUE:
           { nichts zu tun , da es keine Entsprechung für Sonique gibt};
        BASSVIS_WINAMP:
            BASS_WINAMPVIS_Play(globalHVIS);
         BASSVIS_WMP:
          BASS_WMPVIS_Play;
      end;
   end;
   :
   Procedure BASS_WINAMPVIS_Play(handle:HVIS); //wird nicht mehr exportiert !
   begin
     :
   END;
In der Anwendung:

Delphi-Quellcode:
   procedure DoxyzClick(Sender:TObject);
   begin
     if (BASSVIS_INIT(BASSVIS_WINAMP,HInstance,application.handle)) then
         BASSVIS_PLAY;
   end;
Damit vereinfachst du das Interface deiner API, ohne eben die komplette Funktionalität neu zu schreiben

Ideal wäre es natürlich, das gleich in der DLL so zu machen. Damit sparst du dir dann Tipparbeit in den Interface-Deklarationen für die jeweiligen Sprachen
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#26

Re: Neustrukturierung einer DLL

  Alt 7. Jul 2007, 08:59
Ahhh die Idee ist also ..

Das grundgerüßt der Function bleibt erhalten lediglich variablen die nicht identisch , vereinheitlicht
werden können innerhalb BassVis als Variable abzulegen und auszuwerten.
Ja das läßt sich machen.

Delphi-Quellcode:
procedure DoxyzClick(Sender:TObject);
   begin
     if (BASSVIS_INIT(BASSVIS_WINAMP,HInstance,application.handle)) then
         BASSVIS_PLAY;
   end;
Das nicht!

In INIT stehen alle Default variablen hier wird ebenfalls der
Visualisierungsthread und die class BassVis1 generiert.

Da muss ich mir was anderes ausdenken
PS:
Um mehrere Plugins starten zu können muss man halt eine neue Instanz aufrufen denke das auch das gehen müßte-

EDIT:
Bin mir aber immer noch nicht schlüssig wie ich den neuaufbau nun beginnen soll.
Benötige eine MasterUnit von welcher alles umgeleitet wird.

Sollte dort eine neue class erstellt werden wenn ja wie am besten ausgelegt um dort alle Variablen zu kapseln.
Denke hier sollte ich die INIT procedure erstellen aus der dann alles umgeleitet wird.
Will nicht einfach ins blaue hinein anfangen das Konzept muss also schon durchdacht sein
Damit bei einer eventuellen OpenSource Geschichte der Developer sich nicht durch den ganzen Quelltext wurschteln muß.
Außerdem habe ich auch keine lust den ganzen Kram bei einer neuen implementierung
eines VisTypes(Kind) alles wieder neu zumachen.

gruss Emil
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#27

Re: Neustrukturierung einer DLL

  Alt 7. Jul 2007, 09:40
Ähm..um weitere Missverständnisse mal vorzubeugen. Ich bau dir mal eine Beispielunit wie das mit dem Superset gedacht ist
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#28

Re: Neustrukturierung einer DLL

  Alt 7. Jul 2007, 09:41
Zitat von Ghostwalker:
Ähm..um weitere Missverständnisse mal vorzubeugen. Ich bau dir mal eine Beispielunit wie das mit dem Superset gedacht ist
Hmm das wäre Super!
Danke für deine Mühe.

Irgendwie hab ich hier einen Bug im Forum entdeckt die seite ist bei mir hier geteilt!
Komisch nach dem letzen Satz geht sie wieder... schon seltsam

Bin am überlegen ob ich nachher noch die DLL als ComObject auslegen soll
hmmm... zumindest wäre sie dann auch unter Linux anwendbar.
Na eins nach dem anderen.

EDIT:
Hier mal eine ungefähre ablauffolge:

1. Initialisieren
Delphi-Quellcode:
Einmalig aufgerufen.
BASS_WINAMPVIS_INIT(Application.Handle, frmMain.Handle);
2. Plugin laden und Informationen einlesen
Delphi-Quellcode:
GetPlugin;
innerhalb deiner Anwendung
Dort geht es weiter
Delphi-Quellcode:
  flist.CommaText := BASS_VIS_FindPlugins(PChar(PluginDir),
                                          BASS_VIS_FIND_WINAMP or
                                          BASS_VIS_FIND_RECURSIVE or
                                          BASS_VIS_FIND_COMMALIST);
Lugins werden eingelesen
Dann wird die Information des plugins eingeholt
Delphi-Quellcode:
GetPluginInfo;
innerhalb deiner Anwendung
Delphi-Quellcode:
  vischan := BASS_WINAMPVIS_GetHandle(PChar(PluginDir + PluginList.Items[IndexNum]));
  NumModule := BASS_WINAMPVIS_GetNumModules(PChar(PluginDir + PluginList.Items[IndexNum]));
  PluginName := BASS_WINAMPVIS_GetName(vischan);
Jetzt sind alle relevanten Infos zum ausführen der plugins vorhanden.
--------------------------------
3. Plugin starten
Delphi-Quellcode:
    BASS_WINAMPVIS_SetChanInfo(0,
                               PAnsiChar(MediaTitle),
                               PAnsiChar(StreamFile),
                               round(StreamPos),
                               round(StreamLength),
                               Playlist.ItemIndex,
                               Playlist.count);
MediaInformationen senden
Delphi-Quellcode:
      vischan := BASS_WINAMPVIS_ExecuteVis(PChar(PluginDir +
                                          PluginList.Items[IndexNum]),
                                          VisModules.Selection.Top,
                                          True,
                                          ckShowW2.Checked);
      // Get HWND from Winamp Dummy Window
      hWndWinAMP := BASS_WINAMPVIS_GetAmpHwnd;

      // send the last active Playlist index to visplugin
      BASS_WINAMPVIS_SetPlaylistPos(hWndWinAMP, PlaylistPos);

      // Playing Status
      BASS_WINAMPVIS_Play(hWndWinAMP);

      // Check IsPlaying
      ISPlaying := BASS_WINAMPVIS_IsPlaying(hWndWinAMP);
          
      BASS_WINAMPVIS_SetGenHwndParent(hWndGen,
                                          Panel1.Handle,
                                          5,
                                          5,
                                          Panel1.Width - 10,
                                          Panel1.Height - 10);

      BASS_WINAMPVIS_RenderStream(stream);

Plugin starten
usw... das muß im moment bei jeden Typ erfolgen
Kannst dir vorstellen was da für ein schreibkram zustande kommt wenn du alle typen verwenden willst.

gruss Emil
  Mit Zitat antworten Zitat
Ghostwalker

Registriert seit: 16. Jun 2003
Ort: Schönwald
1.299 Beiträge
 
Delphi 10.3 Rio
 
#29

Re: Neustrukturierung einer DLL

  Alt 7. Jul 2007, 12:03
So..im Anhang findest du mal die Interface-Unit. Ich hab jetzt nicht alle Funktionen "globalisiert". Aber zumindest für jeden grundsätzlichen Funktionstypen ein Beispiel. Und das ganze mit reichlich
Kommentaren bedacht

Ich hoffe das damit klar wird, was mit Superset gemeint ist. Ideal wäre es natürlich, das Ganze in der DLL selbst zu machen, statt in der Interface-Unit.

Von COM würde ich dir abraten.

1. Müsste sie dann registriert werden (also in der Registry eingetragen werden)
2. Linux könnte auch so mit einem SO klarkommen
3. Brauchst du auf Linux keine rücksicht nehmen, da es die BASS.DLL nicht für Linux gibt (soweit ich weiß).
Angehängte Dateien
Dateityp: pas bassvis_962.pas (11,6 KB, 4x aufgerufen)
Uwe
e=mc² or energy = milk * coffee²
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#30

Re: Neustrukturierung einer DLL

  Alt 7. Jul 2007, 12:16
@Ghostwalker

Danke sieht fein aus denke das ich damit klar komme
Appropos:
Ist TheDll konfirm ? Also wird der Name generell in Delphi so verwendet
oder von dir ausgedacht.

Meine frage deshalb .. möchte so gut wie möglich sprachkonform bleiben da
andere Leute sonst nicht wissen was damit gemeint ist.

EDIT:
warum laden andere das beispiel ?
Können doch damit nix anfangen ... hehehehe da sieht man mal wieder (OpenSource)
Alles mitnehmen was so anfällt.

Zitat:
Ideal wäre es natürlich, das Ganze in der DLL selbst zu machen, statt in der Interface-Unit.
Ja sowieso
Das interface BassVis wird nur zur initialisierung der DLL und Bass verwendet für nix anderes

gruss Emil
  Mit Zitat antworten Zitat
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:56 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz