![]() |
Re: Neustrukturierung einer DLL
Zitat:
Ä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 |
Re: Neustrukturierung einer DLL
Einfache Lösung:
Delphi-Quellcode:
Diese muß dann einfach beim beenden der Anwendung aufgerufen werden :) (Macht BASS selbst auch nicht anders :))
Procedure BASSVIS_QUIT;
begin if Assigned(BASSVis1)then BASSVis1.free; if Assigned(BASSWMPVis1) then BASSWMPVis1.free; end; |
Re: Neustrukturierung einer DLL
Na dann doch besser ein FreeAndNil(BASSVis1); und FreeAndNil(BASSWMPVis1); ohne irgendwelche IFs.
|
Re: Neustrukturierung einer DLL
@Ghostwalker
Zitat:
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:
gruss |
Re: Neustrukturierung einer DLL
Zitat:
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:
In der Anwendung:
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;
Delphi-Quellcode:
Damit vereinfachst du das Interface deiner API, ohne eben die komplette Funktionalität neu zu schreiben :)
procedure DoxyzClick(Sender:TObject);
begin if (BASSVIS_INIT(BASSVIS_WINAMP,HInstance,application.handle)) then BASSVIS_PLAY; end; 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 :) |
Re: Neustrukturierung einer DLL
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:
Das nicht!
procedure DoxyzClick(Sender:TObject);
begin if (BASSVIS_INIT(BASSVIS_WINAMP,HInstance,application.handle)) then BASSVIS_PLAY; end; 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 |
Re: Neustrukturierung einer DLL
Ähm..um weitere Missverständnisse mal vorzubeugen. Ich bau dir mal eine Beispielunit wie das mit dem Superset gedacht ist :)
|
Re: Neustrukturierung einer DLL
Zitat:
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:
2. Plugin laden und Informationen einlesen
Einmalig aufgerufen.
BASS_WINAMPVIS_INIT(Application.Handle, frmMain.Handle);
Delphi-Quellcode:
Dort geht es weiter
GetPlugin;
innerhalb deiner Anwendung
Delphi-Quellcode:
Dann wird die Information des plugins eingeholt
flist.CommaText := BASS_VIS_FindPlugins(PChar(PluginDir),
BASS_VIS_FIND_WINAMP or BASS_VIS_FIND_RECURSIVE or BASS_VIS_FIND_COMMALIST); Lugins werden eingelesen
Delphi-Quellcode:
GetPluginInfo;
innerhalb deiner Anwendung
Delphi-Quellcode:
Jetzt sind alle relevanten Infos zum ausführen der plugins vorhanden.
vischan := BASS_WINAMPVIS_GetHandle(PChar(PluginDir + PluginList.Items[IndexNum]));
NumModule := BASS_WINAMPVIS_GetNumModules(PChar(PluginDir + PluginList.Items[IndexNum])); PluginName := BASS_WINAMPVIS_GetName(vischan); -------------------------------- 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:
usw... das muß im moment bei jeden Typ erfolgen
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 Kannst dir vorstellen was da für ein schreibkram zustande kommt wenn du alle typen verwenden willst. gruss Emil |
Re: Neustrukturierung einer DLL
Liste der Anhänge anzeigen (Anzahl: 1)
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ß). |
Re: Neustrukturierung einer DLL
@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:
Das interface BassVis wird nur zur initialisierung der DLL und Bass verwendet für nix anderes gruss Emil |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:47 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