![]() |
Neustrukturierung einer DLL
Hi
Wie einige vielleicht hier wissen habe ich die BassVis DLL geschrieben Mein.. den User sein Problem ist nun das er für jede visualisierung WMP/WINAMP/SONIQUE jede menge code schreiben muss da es für jede Visualisierung eigene dem Type angepaßte API gibt. Das es für die Typen fast immer den gleichen aufruf gibt habe ich mir überlegt das ganze etwas zu kürzen. Die Idee ist die Api so auszulegen das mit einen Aufruf jeder Typ angesprochen werden kann. Bisher geht das so! BASS_WINAMP_IsFree BASS_WMP_IsFree usw... Wie würdet ihr vorgehen um den ganzen kram mit einem aufruf zu erledigen ohne zu viel am code zu ändern? Es geht mir also um die Neustukturierung. Die API sieht bisher so aus!
Delphi-Quellcode:
gruss Emil
//'--------------------------- BassVis API Module -----------------------------
//' BassVis API Module ADD-ON for Bass Audio Library //' Copyright © 2007 BrewIdeas@Emil Weiss, All Rights Reserved //' //' Author(s) of this module: Emil Weiss //' //' Code was written in and formatted for 10pt Courier New //'---------------------------------------------------------------------------- unit BassVis; interface uses Windows; type HVIS = DWORD; QWORD = Int64; const // BASS_SONIQUEVIS_CreateVis flags BASS_VIS_NOINIT = 1; // BASS_SONIQUEVIS_SetConfig flags BASS_SONIQUEVIS_CONFIG_FFTAMP = 1; BASS_SONIQUEVIS_CONFIG_FFT_SKIPCOUNT = 2; // Skip count range is from 0 to 3 (because of limited FFT request size) BASS_SONIQUEVIS_CONFIG_WAVE_SKIPCOUNT = 3; // Skip count range is from 0 to (...) try it out, whenever Bass crashes or does not return enough sample data BASS_SONIQUEVIS_CONFIG_SLOWFADE = 4; // Dim light colors to less than half, then slowly fade them out // BASS_WINAMP_SetConfig flags BASS_WINAMPVIS_CONFIG_FFTAMP = 1; // BASS_WMPVIS_SetConfig flags BASS_WMPVIS_CONFIG_FFTAMP = 1; // Bass FFT Amplification values BASS_VIS_FFTAMP_NORMAL = 1; BASS_VIS_FFTAMP_HIGH = 2; BASS_VIS_FFTAMP_HIGHER = 3; BASS_VIS_FFTAMP_HIGHEST = 4; // BASS_VIS_FindPlugin flags BASS_VIS_FIND_SONIQUE = 1; BASS_VIS_FIND_WINAMP = 2; BASS_VIS_FIND_RECURSIVE = 4; // return value type BASS_VIS_FIND_COMMALIST = 8; // Delphi's comma list style (item1,item2,"item 3",item4,"item with space") // the list ends with single NULL character function BASS_SONIQUEVIS_CreateVis(f, visconfig:PChar; flags, w, h: DWORD):HVIS; stdcall; external 'bass_vis.dll'; function BASS_SONIQUEVIS_Render(handle: HVIS; channel: DWORD; canvas: HDC): Boolean; stdcall; external 'bass_vis.dll'; function BASS_SONIQUEVIS_Render2(handle: HVIS; data, fft: Pointer; canvas: HDC; flags, pos: DWORD): Boolean; stdcall; external 'bass_vis.dll'; function BASS_SONIQUEVIS_Free(handle: HVIS): Boolean; stdcall; external 'bass_vis.dll'; function BASS_SONIQUEVIS_GetName(handle: HVIS): PChar; stdcall; external 'bass_vis.dll'; function BASS_SONIQUEVIS_Clicked(handle: HVIS; x, y: DWORD): Boolean; stdcall; external 'bass_vis.dll'; function BASS_SONIQUEVIS_Resize(handle: HVIS; nw, nh: DWORD): Boolean; stdcall; external 'bass_vis.dll'; function BASS_SONIQUEVIS_GetConfig(option: DWORD): DWORD; stdcall; external 'bass_vis.dll'; function BASS_SONIQUEVIS_SetFullScreen(handle: HVIS; SourceHandle: DWORD; DestHandle: DWORD; SourceLeft: DWORD; SourceTop: DWORD; SourceWidth: DWORD; SourceHeight: DWORD; FullScreen: BOOL; FullScreeWidth: DWORD; FullScreenHeight: DWORD): boolean; stdcall; external 'bass_vis.dll'; procedure BASS_SONIQUEVIS_CreateFakeSoniqueWnd; stdcall; external 'bass_vis.dll'; procedure BASS_SONIQUEVIS_DestroyFakeSoniqueWnd; stdcall; external 'bass_vis.dll'; procedure BASS_SONIQUEVIS_SetConfig(option, Value: DWORD); stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_ExecuteVis(PluginName: PChar; moduleNum: integer; ownHdc: boolean; ownHdcW2: boolean): HVIS; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_RenderStream(StreamHandle: DWORD): boolean; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_Free(handle: HVIS): Boolean; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_GetModuleName(handle: HVIS; VismodNum: integer): PChar; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_GetName(handle: HVIS): PChar; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_Config(handle: HVIS; VismodNum: Integer): Boolean; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_SetChanInfo(handle: HVIS; title: PChar; filename: PChar; pos, len: DWORD; PListPos: integer; PLLength: integer): Boolean; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_SetChanMPEGInfo(handle: HVIS; SampleRate, BitRate: integer; Duration: DWORD; Channels: integer): boolean; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_GetNumModules(PluginName: PChar):integer; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_GetHandle(PluginName: PChar): HVIS; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_StartRecord(SampleRate: DWORD; Channels: Integer): boolean; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_GetAmpHwnd: DWORD; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_GetGenHwnd: DWORD; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_Init(AppHandle: DWORD; WinHandle: DWORD): boolean; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_GetConfig(option: DWORD): DWORD; stdcall; external 'bass_vis.dll'; procedure BASS_WINAMPVIS_SetConfig(option, Value: DWORD); stdcall; external 'bass_vis.dll'; procedure BASS_WINAMPVIS_SetGenHwndParent(hWindow : DWORD; hContainer: DWORD; x, y, w, h: Integer); stdcall; external 'bass_vis.dll'; procedure BASS_WINAMPVIS_RecordFree; stdcall; external 'bass_vis.dll'; procedure BASS_WINAMPVIS_Quit; stdcall; external 'bass_vis.dll'; procedure BASS_WINAMPVIS_Play(handle: DWORD); stdcall; external 'bass_vis.dll'; procedure BASS_WINAMPVIS_Pause(handle: DWORD); stdcall; external 'bass_vis.dll'; procedure BASS_WINAMPVIS_Stop(handle: DWORD); stdcall; external 'bass_vis.dll'; procedure BASS_WINAMPVIS_SetPlaylistPos(handle: DWORD; PlPos: Integer); stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_GetPlaylistPos(handle: DWORD):integer; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_IsPlaying(handle: DWORD):integer; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_Init(AppHandle: DWORD; WinHandle: DWORD): boolean; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_ExecuteVis(PlgListIndex: Integer; PresetIndex: Integer; VisWinhandle: DWORD; Left, Top, width, heigth: Integer): HVIS; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_GetPresetTitle(PlgListIndex: Integer; NumPresets: Integer): PChar; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_GetPresetCount(PlgListIndex: Integer):integer; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_GetPluginDescription(): PChar; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_Free(handle: HVIS): boolean; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_RenderStream(StreamHandle: DWORD): boolean; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_FindPlugins(): PChar; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_GetConfig(option: DWORD): DWORD; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_SetFullScreen(SourceHandle: DWORD; DestHandle: DWORD; SourceLeft: DWORD; SourceTop: DWORD; SourceWidth: DWORD; SourceHeight: DWORD; FullScreen: BOOL; FullScreeWidth: DWORD; FullScreenHeight: DWORD): boolean; stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_Resize(SourceWidth: DWORD; SourceHeight: DWORD); stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_SetCurrentPreset(PresetIndex: Integer); stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_Config(hwndOwner: DWORD); stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_SetConfig(option, Value: DWORD); stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_SetMediaInfo(Channels: integer; SampleRate: integer; Title: string); stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_StartRecord(SampleRate: DWORD; Channels: Integer): boolean; stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_RecordFree; stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_Play; stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_Pause; stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_Stop; stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_Quit; stdcall; external 'bass_vis.dll'; function BASS_VIS_FindPlugins(vispath: PChar; flags: DWORD): PChar; stdcall; external 'bass_vis.dll'; implementation end. |
Re: Neustrukturierung einer DLL
Na mach als ersten Parameter aller Funktionen eine ID.
Delphi-Quellcode:
Intern verzweigst du dann einfach auf die spezifischen Funktionen. Das Set der API-Funktionen wird vereinheitlicht. Erstelle ein Superset aller Funktionen. Einige Funktionen tun dann halt nichts.
const
BASSVIS_SONIQUE = 1; BASSVIS_WINAMP = 2; BASSVIS_WMP = 3; Ich glaube BASS_SONIQUEVIS_CreateFakeSoniqueWnd und BASS_SONIQUEVIS_DestroyFakeSoniqueWnd koennen ganz aus dem API fallen. Es sotlle doch moeglich sein das intern in der DLL zu regeln. BTW deklariere 'bass_vis.dll' als Konstante und verwende sie. Das spart ein bischen, da dann der String nur einmal vorhanden ist. |
Re: Neustrukturierung einer DLL
Zitat:
Und verzweigen auf die Functionen ja weis nur noch nicht wie am besten ohne den ganzen quelltext neuzuschreiben. die Const für die BASSVIS_TYPE := ->>> Wie diese const mit der API nach draußen tragen ebenfalls ohne viel zu ändern? Zitat:
Der User muss also zugriff darauf haben und selbst bestimmen können ob er das abhängig von seiner Anwendung erstellen will. Zitat:
Delphi-Quellcode:
welchen vorteil bringt mir das ? bzw.. was spart das.
Const
BASSVIS_API : String = 'BassVis.Dll' |
Re: Neustrukturierung einer DLL
Also ohne das Umschreiben der DLL geht es nicht. Das API enthaelt sowieso so viele kleine Unsauberkeiten und Designschwaechen das man es neu entwerfen sollte.
Offensichtlich erstellt BASS_SONIQUEVIS_CreateFakeSoniqueWnd ein nur in der DLL erreichbares Fenster. Das kann man doch einfach immer erstellen und spart sich die API-Funktionen. Ich meinte
Delphi-Quellcode:
Jedesmal wenn man 'bass_vis.dll' direkt benutzt wird der String im EXE abgelegt. Pro Funktionsdeklaration gibt es daher eine Kopie des Strings in der EXE. Das kann leicht ausarten.
const
BassVisDllName = 'bass_vis.dll'; |
Re: Neustrukturierung einer DLL
Hi Robert
Zitat:
Viele Leute benutzen die DLL und Probleme diesbezüglich hat mir bisher niemand mitgeteilt. Egal unter welcher Sprache sie benutzt wurde. #C_NET,VB_NET,Delphi,Vb,C,C++,MSVC ;) Zitat:
Wenn es immer erstellt wird funktionieren einige andere Plugins nicht mehr. Außerdem stellt deine Anwendung im normalfall das Window für Sonique dar es wird dann nur umgelenkt und den Plugins wird vorgegaukelt das es Sonique ist. Zitat:
Aber warum deklarierst du den Wert nicht ? 'bass_vis.dll kann ja vieles sein denke nach außen hin sollte ich ihm schon einen wert übergeben oder? Zitat:
Wie meinst du das mit SuperSet wie sollte das aussehen. :?: das *.h File sieht so aus und wie gesagt bisher keine fehler gemeldet!
Code:
gruss Emil
#ifndef BASSVIS_H
#define BASSVIS_H #include <wtypes.h> #ifdef __cplusplus extern "C" { #endif #ifndef BASSVISDEF #define BASSVISDEF(f) WINAPI f #endif typedef DWORD HVIS; typedef unsigned __int64 QWORD; // BASS_SONIQUEVIS_CreateVis flags #define BASS_VIS_NOINIT 1 // BASS_SONIQUEVIS_SetConfig flags #define BASS_SONIQUEVIS_CONFIG_FFTAMP 1 #define BASS_SONIQUEVIS_CONFIG_FFT_SKIPCOUNT 2 // Skip count range is from 0 to 3 (because of limited FFT request size) #define BASS_SONIQUEVIS_CONFIG_WAVE_SKIPCOUNT 3 // Skip count range is from 0 to (...) try it out, whenever Bass crashes or does not return enough sample data #define BASS_SONIQUEVIS_CONFIG_SLOWFADE 4 // Dim light colors to less than half, then slowly fade them out // BASS_WINAMP_SetConfig flags #define BASS_WINAMPVIS_CONFIG_FFTAMP 1 // BASS_WMPVIS_SetConfig flags #define BASS_WMPVIS_CONFIG_FFTAMP 1 // Bass FFT Amplification values #define BASS_VIS_FFTAMP_NORMAL 1 #define BASS_VIS_FFTAMP_HIGH 2 #define BASS_VIS_FFTAMP_HIGHER 3 #define BASS_VIS_FFTAMP_HIGHEST 4 // BASS_VIS_FindPlugin flags #define BASS_VIS_FIND_SONIQUE 1 #define BASS_VIS_FIND_WINAMP 2 #define BASS_VIS_FIND_RECURSIVE 4 // return value type #define BASS_VIS_FIND_COMMALIST 8 // Delphi's comma list style (item1,item2,"item 3",item4,"item with space") // the list ends with single NULL character HVIS BASSVISDEF(BASS_SONIQUEVIS_CreateVis)(char *f, char *visconfig, DWORD flags, DWORD w, DWORD h); BOOL BASSVISDEF(BASS_SONIQUEVIS_SetFullScreen)(HVIS handle, DWORD SourceHandle, DWORD DestHandle, DWORD SourceLeft, DWORD SourceTop, DWORD SourceWidth, DWORD SourceHeight, BOOL FullScreen, DWORD FullScreeWidth, DWORD FullScreenHeight); BOOL BASSVISDEF(BASS_SONIQUEVIS_Render)(HVIS handle, DWORD channel, HDC canvas); BOOL BASSVISDEF(BASS_SONIQUEVIS_Render2)(HVIS handle, void *data, void *fft, HDC canvas, DWORD flags, DWORD pos); BOOL BASSVISDEF(BASS_SONIQUEVIS_Free)(HVIS handle); BOOL BASSVISDEF(BASS_SONIQUEVIS_Clicked)(HVIS handle, DWORD x, DWORD y); BOOL BASSVISDEF(BASS_SONIQUEVIS_Resize)(HVIS handle, DWORD nw, DWORD nh); DWORD BASSVISDEF(BASS_SONIQUEVIS_GetConfig)(DWORD option); char* BASSVISDEF(BASS_SONIQUEVIS_GetName)(HVIS handle); void BASSVISDEF(BASS_SONIQUEVIS_CreateFakeSoniqueWnd)(); void BASSVISDEF(BASS_SONIQUEVIS_DestroyFakeSoniqueWnd)(); void BASSVISDEF(BASS_SONIQUEVIS_SetConfig)(DWORD option, DWORD Value); HVIS BASSVISDEF(BASS_WINAMPVIS_ExecuteVis)(char *PluginName, int moduleNum, BOOL ownHdc, BOOL ownHdcW2); HVIS BASSVISDEF(BASS_WINAMPVIS_GetHandle)(char *PluginName); BOOL BASSVISDEF(BASS_WINAMPVIS_RenderStream)(DWORD StreamHandle); BOOL BASSVISDEF(BASS_WINAMPVIS_Free)(HVIS handle); BOOL BASSVISDEF(BASS_WINAMPVIS_Config)(HVIS handle, int VismodNum); BOOL BASSVISDEF(BASS_WINAMPVIS_SetChanInfo)(HVIS handle, char* title, char* filename, DWORD pos, DWORD len, DWORD plistpos, DWORD pllength); BOOL BASSVISDEF(BASS_WINAMPVIS_SetChanMPEGInfo)(HVIS handle, int SampleRate, int BitRate, DWORD Duration, int Channels); BOOL BASSVISDEF(BASS_WINAMPVIS_StartRecord)(DWORD SampleRate, int Channels); BOOL BASSVISDEF(BASS_WINAMPVIS_Init)(DWORD AppHandle, DWORD WinHandle); BOOL BASSVISDEF(BASS_WINAMPVIS_Config)(HVIS handle, int VismodNum); BOOL BASSVISDEF(BASS_WINAMPVIS_IsFree)(); DWORD BASSVISDEF(BASS_WINAMPVIS_GetAmpHwnd)(); DWORD BASSVISDEF(BASS_WINAMPVIS_GetGenHwnd)(); DWORD BASSVISDEF(BASS_WINAMPVIS_GetConfig)(DWORD option); char* BASSVISDEF(BASS_WINAMPVIS_GetModuleName)(HVIS handle, int VismodNum); char* BASSVISDEF(BASS_WINAMPVIS_GetName)(HVIS handle); int BASSVISDEF(BASS_WINAMPVIS_GetNumModules)(char *PluginName); void BASSVISDEF(BASS_WINAMPVIS_SetGenHwndParent)(DWORD hWindow, DWORD hContainer, int x, int y, int width, int height); void BASSVISDEF(BASS_WINAMPVIS_RecordFree)(); void BASSVISDEF(BASS_WINAMPVIS_Quit)(); void BASSVISDEF(BASS_WINAMPVIS_SetConfig)(DWORD option, DWORD value); void BASSVISDEF(BASS_WINAMPVIS_Play)(DWORD handle); void BASSVISDEF(BASS_WINAMPVIS_Pause)(DWORD handle); void BASSVISDEF(BASS_WINAMPVIS_Stop)(DWORD handle); void BASSVISDEF(BASS_WINAMPVIS_SetPlaylistPos)(handle: DWORD, int PlPos); DWORD BASSVISDEF(BASS_WINAMPVIS_GetPlaylistPos)(DWORD handle); DWORD BASSVISDEF(BASS_WINAMPVIS_IsPlaying)(DWORD handle); HVIS BASSVISDEF(BASS_WMPVIS_ExecuteVis)(int PlgListIndex, int PresetIndex, DWORD VisWinhandle, int Left, int Top, int width, int heigth); int BASSVISDEF(BASS_WMPVIS_GetPresetCount)(int PlgListIndex); char* BASSVISDEF(BASS_WMPVIS_GetPresetTitle)(int PlgListIndex, int NumPresets); char* BASSVISDEF(BASS_WMPVIS_GetPluginDescription)(); char* BASSVISDEF(BASS_WMPVIS_FindPlugins)(); DWORD BASSVISDEF(BASS_WMPVIS_GetConfig)(DWORD option); BOOL BASSVISDEF(BASS_WMPVIS_Init)(DWORD AppHandle, DWORD WinHandle); BOOL BASSVISDEF(BASS_WMPVIS_Free)(HVIS handle); BOOL BASSVISDEF(BASS_WMPVIS_IsFree)(); BOOL BASSVISDEF(BASS_WMPVIS_RenderStream)(DWORD StreamHandle); BOOL BASSVISDEF(BASS_WMPVIS_StartRecord)(DWORD SampleRate, int Channels); BOOL BASSVISDEF(BASS_WMPVIS_SetFullScreen)(DWORD SourceHandle, DWORD DestHandle, DWORD SourceLeft, DWORD SourceTop, DWORD SourceWidth, DWORD SourceHeight, BOOL FullScreen, DWORD FullScreeWidth, DWORD FullScreenHeight); void BASSVISDEF(BASS_WMPVIS_SetMediaInfo)(int Channels, int SampleRate, Title: char); void BASSVISDEF(BASS_WMPVIS_SetCurrentPreset)(int PresetIndex); void BASSVISDEF(BASS_WMPVIS_Config)(DWORD hwndOwner); void BASSVISDEF(BASS_WMPVIS_SetConfig)(DWORD option, DWORD value); void BASSVISDEF(BASS_WMPVIS_RecordFree)(); void BASSVISDEF(BASS_WMPVIS_Play)(); void BASSVISDEF(BASS_WMPVIS_Pause)(); void BASSVISDEF(BASS_WMPVIS_Stop)(); void BASSVISDEF(BASS_WMPVIS_Quit)(); char* BASSVISDEF(BASS_VIS_FindPlugins)(char *vispath, DWORD flags); #ifdef __cplusplus } #endif #endif |
Re: Neustrukturierung einer DLL
Erst mal zu den Unsauberkeiten und Designschwaechen. Siehe die Kommentare "// (rom)".
Delphi-Quellcode:
//'--------------------------- BassVis API Module -----------------------------
//' BassVis API Module ADD-ON for Bass Audio Library //' Copyright © 2007 BrewIdeas@Emil Weiss, All Rights Reserved //' //' Author(s) of this module: Emil Weiss //' //' Code was written in and formatted for 10pt Courier New //'---------------------------------------------------------------------------- unit BassVis; interface uses Windows; type // (rom) warum nicht THandle? HVIS = DWORD; QWORD = Int64; const // BASS_SONIQUEVIS_CreateVis flags BASS_VIS_NOINIT = 1; // BASS_SONIQUEVIS_SetConfig flags BASS_SONIQUEVIS_CONFIG_FFTAMP = 1; BASS_SONIQUEVIS_CONFIG_FFT_SKIPCOUNT = 2; // Skip count range is from 0 to 3 (because of limited FFT request size) BASS_SONIQUEVIS_CONFIG_WAVE_SKIPCOUNT = 3; // Skip count range is from 0 to (...) try it out, whenever Bass crashes or does not return enough sample data BASS_SONIQUEVIS_CONFIG_SLOWFADE = 4; // Dim light colors to less than half, then slowly fade them out // BASS_WINAMP_SetConfig flags BASS_WINAMPVIS_CONFIG_FFTAMP = 1; // BASS_WMPVIS_SetConfig flags BASS_WMPVIS_CONFIG_FFTAMP = 1; // Bass FFT Amplification values BASS_VIS_FFTAMP_NORMAL = 1; BASS_VIS_FFTAMP_HIGH = 2; BASS_VIS_FFTAMP_HIGHER = 3; BASS_VIS_FFTAMP_HIGHEST = 4; // BASS_VIS_FindPlugin flags BASS_VIS_FIND_SONIQUE = 1; BASS_VIS_FIND_WINAMP = 2; BASS_VIS_FIND_RECURSIVE = 4; // return value type BASS_VIS_FIND_COMMALIST = 8; // Delphi's comma list style (item1,item2,"item 3",item4,"item with space") // the list ends with single NULL character // (rom) Es wird viel zuviel DWORD benutzt. Es gibt z. B. ULONG als Alternative. // (rom) Das ist zwar effektiv das Gleiche, aber der Typname drueckt auch den Verwendungszweck aus. // (rom) aussagekraeftige Parameternamen verwenden function BASS_SONIQUEVIS_CreateVis(f, visconfig:PChar; flags, w, h: DWORD):HVIS; stdcall; external 'bass_vis.dll'; function BASS_SONIQUEVIS_Render(handle: HVIS; channel: DWORD; canvas: HDC): Boolean; stdcall; external 'bass_vis.dll'; function BASS_SONIQUEVIS_Render2(handle: HVIS; data, fft: Pointer; canvas: HDC; flags, pos: DWORD): Boolean; stdcall; external 'bass_vis.dll'; function BASS_SONIQUEVIS_Free(handle: HVIS): Boolean; stdcall; external 'bass_vis.dll'; function BASS_SONIQUEVIS_GetName(handle: HVIS): PChar; stdcall; external 'bass_vis.dll'; function BASS_SONIQUEVIS_Clicked(handle: HVIS; x, y: DWORD): Boolean; stdcall; external 'bass_vis.dll'; function BASS_SONIQUEVIS_Resize(handle: HVIS; nw, nh: DWORD): Boolean; stdcall; external 'bass_vis.dll'; function BASS_SONIQUEVIS_GetConfig(option: DWORD): DWORD; stdcall; external 'bass_vis.dll'; // (rom) Boolean ist fast sicher falsch. Boolean ist ein 1-Byte-Typ. Vermutlich ist BOOL gemeint. function BASS_SONIQUEVIS_SetFullScreen(handle: HVIS; SourceHandle: DWORD; DestHandle: DWORD; SourceLeft: DWORD; SourceTop: DWORD; SourceWidth: DWORD; SourceHeight: DWORD; FullScreen: BOOL; FullScreeWidth: DWORD; FullScreenHeight: DWORD): boolean; stdcall; external 'bass_vis.dll'; procedure BASS_SONIQUEVIS_CreateFakeSoniqueWnd; stdcall; external 'bass_vis.dll'; procedure BASS_SONIQUEVIS_DestroyFakeSoniqueWnd; stdcall; external 'bass_vis.dll'; procedure BASS_SONIQUEVIS_SetConfig(option, Value: DWORD); stdcall; external 'bass_vis.dll'; // (rom) auch hier vermute ich das BOOL statt Boolean korrekt ist function BASS_WINAMPVIS_ExecuteVis(PluginName: PChar; moduleNum: integer; ownHdc: boolean; ownHdcW2: boolean): HVIS; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_RenderStream(StreamHandle: DWORD): boolean; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_Free(handle: HVIS): Boolean; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_GetModuleName(handle: HVIS; VismodNum: integer): PChar; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_GetName(handle: HVIS): PChar; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_Config(handle: HVIS; VismodNum: Integer): Boolean; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_SetChanInfo(handle: HVIS; title: PChar; filename: PChar; pos, len: DWORD; PListPos: integer; PLLength: integer): Boolean; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_SetChanMPEGInfo(handle: HVIS; SampleRate, BitRate: integer; Duration: DWORD; Channels: integer): boolean; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_GetNumModules(PluginName: PChar):integer; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_GetHandle(PluginName: PChar): HVIS; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_StartRecord(SampleRate: DWORD; Channels: Integer): boolean; stdcall; external 'bass_vis.dll'; // (rom) Der korrekte Typ fuer ein Fenster-Handle ist HWND. function BASS_WINAMPVIS_GetAmpHwnd: DWORD; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_GetGenHwnd: DWORD; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_Init(AppHandle: DWORD; WinHandle: DWORD): boolean; stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_GetConfig(option: DWORD): DWORD; stdcall; external 'bass_vis.dll'; procedure BASS_WINAMPVIS_SetConfig(option, Value: DWORD); stdcall; external 'bass_vis.dll'; // (rom) HWND procedure BASS_WINAMPVIS_SetGenHwndParent(hWindow : DWORD; hContainer: DWORD; x, y, w, h: Integer); stdcall; external 'bass_vis.dll'; procedure BASS_WINAMPVIS_RecordFree; stdcall; external 'bass_vis.dll'; procedure BASS_WINAMPVIS_Quit; stdcall; external 'bass_vis.dll'; // (rom) HWND oder HVIS (vermutlich HVIS). procedure BASS_WINAMPVIS_Play(handle: DWORD); stdcall; external 'bass_vis.dll'; procedure BASS_WINAMPVIS_Pause(handle: DWORD); stdcall; external 'bass_vis.dll'; procedure BASS_WINAMPVIS_Stop(handle: DWORD); stdcall; external 'bass_vis.dll'; procedure BASS_WINAMPVIS_SetPlaylistPos(handle: DWORD; PlPos: Integer); stdcall; external 'bass_vis.dll'; function BASS_WINAMPVIS_GetPlaylistPos(handle: DWORD):integer; stdcall; external 'bass_vis.dll'; // (rom) warum wird kein BOOL zurueckgeliefert? function BASS_WINAMPVIS_IsPlaying(handle: DWORD):integer; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_Init(AppHandle: DWORD; WinHandle: DWORD): boolean; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_ExecuteVis(PlgListIndex: Integer; PresetIndex: Integer; VisWinhandle: DWORD; Left, Top, width, heigth: Integer): HVIS; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_GetPresetTitle(PlgListIndex: Integer; NumPresets: Integer): PChar; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_GetPresetCount(PlgListIndex: Integer):integer; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_GetPluginDescription(): PChar; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_Free(handle: HVIS): boolean; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_RenderStream(StreamHandle: DWORD): boolean; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_FindPlugins(): PChar; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_GetConfig(option: DWORD): DWORD; stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_SetFullScreen(SourceHandle: DWORD; DestHandle: DWORD; SourceLeft: DWORD; SourceTop: DWORD; SourceWidth: DWORD; SourceHeight: DWORD; FullScreen: BOOL; FullScreeWidth: DWORD; FullScreenHeight: DWORD): boolean; stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_Resize(SourceWidth: DWORD; SourceHeight: DWORD); stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_SetCurrentPreset(PresetIndex: Integer); stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_Config(hwndOwner: DWORD); stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_SetConfig(option, Value: DWORD); stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_SetMediaInfo(Channels: integer; SampleRate: integer; Title: string); stdcall; external 'bass_vis.dll'; function BASS_WMPVIS_StartRecord(SampleRate: DWORD; Channels: Integer): boolean; stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_RecordFree; stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_Play; stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_Pause; stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_Stop; stdcall; external 'bass_vis.dll'; procedure BASS_WMPVIS_Quit; stdcall; external 'bass_vis.dll'; function BASS_VIS_FindPlugins(vispath: PChar; flags: DWORD): PChar; stdcall; external 'bass_vis.dll'; implementation end. |
Re: Neustrukturierung einer DLL
Hi Robert erstmal Danke für das auseinandernehmen der API ;)
Zitat:
Und der Wert nichts mit einem THandle zu tun hat.
Delphi-Quellcode:
Result := DWORD(Vismod[moduleNum]);
Zitat:
visConfig sagt mir das hier die konfiguration (Pfad zur Konfig) der Vis übergeben werden soll weiss nun nicht was da nicht aussagekräftig ist ? Zitat:
Brauche werde LongBool noch WordBool Zitat:
Zitat:
In VB ist es long der name sagt da nichts aus Übergebe ich nur HWND weiss VB nicht ob es ein integer, long oder sonstiger wert ist. Bei VB sieht das so aus. HWND as Long Wenn ich also nur HWND aus Delphi übergebe kennt VB den Wert nicht! Bei DWORD gibt es kein Problem damit. Zitat:
Deshalb auch hier nicht HVIS (könnte man aber ändern) Zitat:
1 = Play, 0 = stop, 3 = pause gruss Emil |
Re: Neustrukturierung einer DLL
HVIS ist ok.
f, w, h sind keine aussagekraeftige Namen. Boolean ist sicher falsch, da das .h File BOOL deklariert fuer die Rueckgabewerte und Parameter. BOOL ist 4 Byte lang. BOOL verwenden (ist in Windows.pas enthalten). Immer den korrekten Typ verwenden, HWND bzw HVIS. Das macht das API verstaendlicher. VB steht hier nicht zur Debatte. BASS_WINAMPVIS_IsPlaying ist also ein schlechter Name. BASS_WINAMPVIS_PlayState waere besser. "Is" deutet immer einen booleschen Rueckgabewert an und mit den nachlaessig gbenutzten Typen kann man nicht erkennen das hier eben kein boolescher Wert geliefert wird. |
Re: Neustrukturierung einer DLL
Zitat:
Das -h file habe ich ja selbst erstellt kann da also ändern was ich will ;) Zitat:
Zitat:
Zitat:
Da muss ich also darauf achten das auch übergebene variabeln aus Delphi dort funktionieren. Zitat:
Dann aber BASS_WINAMPVIS_GetPlayState da ich ihn erfragen will nur BASS_WINAMPVIS_PlayState würde bei mir eine übergabe vorraussetzen. gruss Emil |
Re: Neustrukturierung einer DLL
Wäre jemand bereit mir ein Sample oder beispiel zu zeigen
wie man die ganzen funktionen am besten zusammenführt ohne viel am Code selbst ändern zu müssen? Wir sind leider etwas vom eigentlichen thema abgekommen. Meine Idee ist erstmal eine type anstatt einer Const zu verwenden
Delphi-Quellcode:
Wenn eine neue Instanz von außen erstellt wird wie müßte die classe am besten generiert werden
Type
BassVisTypes = (Winamp, Sonique, WinMediaplayer) VisTyes : BassVisTypes; class(Tcomponent) oder wie ? Im moment verwende ich eine classe
Delphi-Quellcode:
wenn möglich sollte diese erhalten bleiben aber aus der anderen gesteuert werden können.
TBASSVis = class(TComponent)
Jaja mir fehlt noch einiges an wissen ;) Deshalb frage ich ja. gruss Emil |
Re: Neustrukturierung einer DLL
Der Nachteil einer Enumeration ist das bei Delphi nur ein Byte fuer den Typ genommen wird, waehrend C 4 Bytes nimmt. Bleibt man bei einfachen Konstanten und nimmt Integer als Typ fuer den Parameter so erspart man sich die Probleme mit der Groesse des Typs.
Es heisst uebrigens in englisch nicht "type" sondern "kind" (Art). Das ist ein beliebter Fehler bei der Namensgebung.
Delphi-Quellcode:
const
BASSVISKIND_SONIQUE = 1; BASSVISKIND_WINAMP = 2; BASSVISKIND_WMP = 3; type BASSVIS_KIND_T = Integer;
Code:
Zur Abstraktion sollte man uebrigens alles mit eigenen Typen versehen. Das bewirkt das die Programme in allen Sprachen aehnlicher aussehen. Die jeweilige Header-Datei mappt dann die Typen auf passende Basistypen.
#define BASSVIS_SONIQUE 1
#define BASSVIS_WINAMP 2 #define BASSVIS_WMP 3 typedef int BASSVIS_KIND_T; So jetzt zu der Idee des Supersets. Die APIs haben nicht so viel Ueberschneidung. Das sollte man erst mal aufarbeiten. Ein Beispiel waere dies:
Delphi-Quellcode:
Das ist jetzt nur die grobe Richtung in der es gehen soll. Das API muss noch deutlich vereinheitlicht werden.
procedure BASSVIS_Play(Kind: BASSVIS_KIND_T; Handle: HVIS); stdcall;
begin case Kind of BASSVISKIND_SONIQUE: { nichts zu tun }; BASSVIS_WINAMP: BASS_WINAMPVIS_Play(Handle); BASSVIS_WMP: BASS_WMPVIS_Play; end; end; |
Re: Neustrukturierung einer DLL
Zitat:
Da ich dann über ein untermenü verfüge und bei case anweisungen die deklarierte Type als vergleich nehmen kann. Zitat:
Mein hauptproblem kurz erklärt Sorry Beispiel VB_NET habe da mal auf die schnelle was zusammen gezimmert da ich mich hier besser auskenne als in Delphi.
Code:
Wenn ich hier die DLL aufrufe
Public Sub New(ByVal PluginPath As String, ByVal DefaultVisualizationType As VisualsType, ByVal WindowHandle As Int32, ByRef Container As Windows.Forms.Control, ByVal StreamOrMixerHandle As Int32)
If m_WindowHandle = 0 Then 'Store the type of visualization being performed m_VisType = DefaultVisualizationType 'Set the container object for the visuals m_VisContainer = Container 'Store the window handle m_WindowHandle = WindowHandle 'Get the Device Context for the control m_ContainerhDC = GetWindowDC(m_VisContainer.Handle) 'Get the device handle for the control Try m_VisContainerHandle = m_VisContainer.Handle Catch m_VisContainerHandle = 0 End Try 'Store the stream handle m_BassStream = StreamOrMixerHandle 'Set the default plugin path m_PluginPath = PluginPath 'Load the bass vis plugin Call LoadBassVis() Else Throw New Exception("This object already has a window applied, destroy this object instance and create a new one.") End If End Sub
Code:
dann erstellt m_VisWrapper eine neue Instanz und die eigenschaften der DLL können dann über m_VisWrapper
'Create the new bass wrapper if playback started
m_VisWrapper = New BASSVis_Wrapper.BassVisWrapper(Application.StartupPath & "\plugins\", m_CurrentType, Me.Handle, pbVisuals, m_Mixer) verwaltet werden denke du verstehst was ich meine. Die DLL wird dann quasi als verweis in das Projekt mit eingebunden. Ist das unter Delphi möglich? Oder wie am besten vorgehen das ich beim wechsel eines VisType jedesmal eine neue Instanz erzeuge. Da komme ich unter Delphi irgendwie nicht mit klar. LoadBassVis macht dann genau das was du unter SuperSet verstehst.
Code:
Mir geht es um das Problem der Initialisierung und der automatischen zerstörung der Instanz
Private Sub LoadBassVis()
'get hInstance from Applications handle m_VisWindowHandle = BassVis.GetWindowLongPtr(m_WindowHandle, Un4seen.Bass.AddOn.Vis.GWLIndex.GWL_HINSTANCE) If m_VisType = VisualsType.WinAMP Then 'Init BassVis BassVis.BASS_WINAMPVIS_Init(m_VisWindowHandle, m_WindowHandle) ElseIf m_VisType = VisualsType.WindowsMedia Then 'Init BassVis BassVis.BASS_WMPVIS_Init(m_VisWindowHandle, m_WindowHandle) End If End Sub wenn der VisTyp geändert wird. gruss und danke für die Infos Emil |
Re: Neustrukturierung einer DLL
Die Frage ist ob der Benutzer alle drei APIs parallel verwenden will oder immer nur eines. Will er nur eines der APIs verwenden, dann kann man ja eine Initialiiserungsfunktion und eine Finalisierungsfunktion einfuehren und spart sich den Parameter.
BASSVIS_Initialize(Kind) und BASSVIS_Finalize(Kind). Kind hebt man sich in einer globalen Variablen in der DLL auf und macht die Switches anhand dieser Variablen anstatt des Parameters. Die beiden Funktionen kuemmern sich auch um die Initialisierung und Finalisierung des jeweiligen APIs so das man diese nacheinander verwenden kann. Mit dem VB mus ich mich noch beschaeftigen. |
Re: Neustrukturierung einer DLL
Zitat:
Beim start wird eine neue Instanz von BassVis erstellt ohne irgendeinen Typ auszuführen. Bei der auswahl eines Types werden die Plugins eingeladen abhängig vom Typ Beim wechsel das gleiche nur das die alte Instanz dann zerstört werden soll was ich innerhalb bassvis regeln muss sobald ein neuer typ initialisiert wird. Dies sollte aber automatisch geschehen classen abhängig. Die VisTypen sollen also on the Fly geändert werden können ohne das ich hunderte API's der verschiedenen Arten außerhalb BassVis verwenden muss. Wenn er nur eins verwenden will (auch auf dieser art möglich) brauchte ich die API nicht umschreiben Da aber drei verschiedene Typen nutzbar sind muss ich davon ausgehen das auch alle verwendet werden. gruss Emil |
Re: Neustrukturierung einer DLL
Mal ans eingemachte
Mit dieser funktion Initialisiere ich zum beispiel Winamp-Plugins
Delphi-Quellcode:
function BASS_WINAMPVIS_Init(AppHandle: DWORD; WinHandle: DWORD): boolean; stdcall;
begin try ApplicationHandle := AppHandle; FormParentHandle := WinHandle; BassVis1 := TBassVis.Create(nil); finally // Nothing end; result := True; BassVisInit := Result; end;
Delphi-Quellcode:
constructor TBASSVis.Create(AOwner: TComponent);
begin inherited Create(AOwner); DecodeChannel := 0; FPlayerMode := plmStandby; FStreamName := ''; FStreamInfo.FileName := nil; FStreamInfo.FileSize := 0; FStreamInfo.SampleRate := 0; FStreamInfo.Pos := 0; FStreamInfo.Len := 0; FStreamInfo.PlaylistFileLength := 0; FStreamInfo.PlaylistPos := 0; ....
Delphi-Quellcode:
Kann ich die INIT Routine so belassen wenn ich zu dieser funktion das Kind addiere?
destructor TBASSVis.Destroy;
Und den Namen BASS_WINAMPVIS_Init nach BASSVIS_Init umbenenne.
Delphi-Quellcode:
theoretisch müßte ja dann bei jeden neuen aufruf von INIT zuerst Destroy ausgelößt werden
function BASSVIS_Init(Kind: BASSVIS_KIND_T; AppHandle: DWORD; WinHandle: DWORD): boolean; stdcall;
das wäre ja dann ein automatisches beenden der classe. In Destroy müßte dann nur das Kind verglichen werden um das vorher aktivierte Plugin zu beenden. Wäre das eine Lösung ? bzw.. welchen Namen könnte man der Function übergeben das es unter allen anderen Sprachen korrekt interpretiert wird. gruss Emil |
Re: Neustrukturierung einer DLL
Warum willst du verhindern, das jemand mehrere unterschiedliche Plugin's gleichzeitig verwendet ?
|
Re: Neustrukturierung einer DLL
Zitat:
Sonique Plugins benötigen im VollScreen fast 80% CPU je nach dem wie hoch der ScreenMode eingestellt ist. Bei Winamp und WMP ist das nicht viel anders. Man sollte daher vermeiden das mehrere Plugins gleichzeitig laufen. Die Anwendung verwendet ja auch noch resourcen und ich will nicht schuld sein das da nachher nix mehr läuft. EDIT: Und ich arbeite schon mit FFTW der Turbo unter den FFT Algorythmen gruss Emil |
Re: Neustrukturierung einer DLL
ok..es gibt ein paar Plugins die wirklich Resourcen fressen. Und Winamp selbst machts auch so,das es das alte Plugin beendet, bevor es das neue startet.
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. Damit kannst du dann die Interface-Routinen stark vereinfachen. Für "Create" und "Destroy" brauchst du jeweils nur 1 Funktion. Der wird vom Anwender übergeben, welche Art von Plugin er haben möchte. Alle anderen Funktionen brauchst du auch nur einmal, da du ja dann intern weißt, welcher Plugintyp läuft. Das würde dann fürs Erzeugen z.B. so aussehen:
Delphi-Quellcode:
So kannst du alle Funktionen die notwendig sind, globalisieren.function BASSVIS_INIT(Kind:BASSVIS_KIND_T;AppHandle:Dword;WndHandle:HWND):bool; begin if (GLOBALHVIS <> 0) then BASSVIS_EXIT; //altes Plugin freigeben GlobalKind := Kind; Case Kind of SONIQUE : GLOBALHVIS := BASS_SONIQUEVIS_CreateVis... WINAMP : GLOBALVIS := BASS_WINAMPVIS_ExecuteVis.... WMP : GLOBALVIS := BASS_WMPVIS_ExecuteVis.... end; end; |
Re: Neustrukturierung einer DLL
Wäre eine möglichkeit ;)
Aber ganz so einach ist es nicht. Da beim initialisieren auf keinen Fall ein Plugin ausgeführt werden darf diese ist nur da um default Values einzulesen und die zum Plugin gehörende class(TComponent) zu initialisieren. Habe das mal ansatzweise versucht scheitere aber schon daran wenn das WMP Plugin aufgerufen wird beim beenden der Anwendung Destroy nicht aufgerufen wird. Wenn BASSVis1 aufgerufen wurde und die Anwendung beendet funktioniert das Destroy event (dort springt er rein)
Delphi-Quellcode:
gruss Emil
function BASSVIS_Init(Kind: BASSVIS_KIND_T; AppHandle: HWND; WinHandle: HWND): BOOL; stdcall;
begin try ApplicationHandle := AppHandle; FormParentHandle := WinHandle; if Assigned(BASSVis1)then BASSVis1.Destroy; if Assigned(BASSWMPVis1) then BASSWMPVis1.Destroy; begin case Kind of BASSVISKIND_WINAMP: BassVis1 := TBassVis.Create(nil); BASSVISKIND_SONIQUE: { nichts zu tun }; BASSVISKIND_WMP: BassWMPVis1 := TBassWMPVis.Create(nil); end; end; finally // end; result := True; BassVisInit := Result; end; end. |
Re: Neustrukturierung einer DLL
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 ? |
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 |
Re: Neustrukturierung einer DLL
Wie du die Konstante benennst bleibt vollkommen dir überlassen. Den Namen hab ich mir einfach mal so ausgedacht. :)
|
Re: Neustrukturierung einer DLL
Zitat:
Werd vom fortschritt berichten. Wenn du interesse hast kann ich dir demnächst mal den QuellText von BassVis schicken aber Achtung: Dieser ist kein OpenSource und darf in keiner weise öffentlich gemacht werden. Muss aber erst mal noch was dran tun :-D Benötige irgendwann einen Nachfolger denn so Jung bin ich auch nicht mehr .. :-D :-D :oops: gruss Emil |
Re: Neustrukturierung einer DLL
Habe da noch ein verständnis problem
Du schreibst
Delphi-Quellcode:
Verstehe ich nun nicht so recht :?:
procedure BASSVIS_Execute(Para:TExecutePara);
Denn genau diese Funktion sollte exportiert und der ganze andere Kram gelöscht werden. Das soll dann gelöscht werden
Delphi-Quellcode:
Also eine Funktion für drei.
function BASS_WINAMPVIS_ExecuteVis(PluginName: PChar; moduleNum: integer; ownHdc: boolean; ownHdcW2: boolean): HVIS; stdcall; external TheDll;
function BASS_SONIQUEVIS_CreateVis(f, visconfig:PChar; flags, w, h: DWORD):HVIS; stdcall; external TheDll; function BASS_WMPVIS_ExecuteVis(PlgListIndex: Integer; PresetIndex: Integer; VisWinhandle: DWORD; Left, Top, width, heigth: Integer): HVIS; stdcall; external TheDll; Aber alle Funktionen der verschiedenen Typen mit obiger procedure ausführbar sein. Denke dann mal das diese so nicht bleiben kann. Ich müßte sie dann so umschreiben wie diese
Delphi-Quellcode:
und intern die Originale function umbenennen eg..
BASSVIS_ExecuteVis(Kind: BASSVIS_KIND_T; PluginName: PChar; moduleNum: integer; ownHdc: boolean; ownHdcW2: boolean):HVIS; stdcall;
ExecuteWinampVis(PluginName: PChar; moduleNum: integer; ownHdc: boolean; ownHdcW2: boolean): HVIS; kann dann beim vergleich wenn der Type(Kind) Winamp ist
Delphi-Quellcode:
in die umbenannte/alte function springen
BASSVIS_ExecuteVis(Kind: BASSVIS_KIND_T; PluginName: PChar; moduleNum: integer; ownHdc: boolean; ownHdcW2: boolean):HVIS; stdcall;
begin case Kind of BASSVISKIND_WINAMP: Result := ExecuteWinampVis(PluginName, moduleNum, ownHdc, ownHdcW2) BASSVISKIND_SONIQUE: Result := CreateVis(... BASSVISKIND_WMP. Result := ExecuteWMPVis(... else Result := 0; end; end; Anders gehts glaube ich nicht. gruss Emil |
Re: Neustrukturierung einer DLL
Zitat:
Zitat:
Zitat:
der Anwender keinen Kopf machen, welche Funktion er denn für ein Plugin er nun aufrufen muß, da es immer die gleiche ist :) Zitat:
stecken im Record. Die globalisierte Funktion geht jetzt her, und ruft die internen Funktionen (die aus der DLL) mit den entsprechenden Parametern aus dem Record und ggf. den intern gespeicherten Informationen auf. Man könnte auch sagen, das du eine gemeinsame Zugriffsschicht über deine DLL-Funktionen legst. Btw. In welcher Sprache ist eigentlich die DLL geschrieben ? |
Re: Neustrukturierung einer DLL
Ich sage ja wir haben ein verständnis Problem ;)
Zitat:
Ich befinde mich in der DLL und will diese Funktionen aus der DLL exportieren.
Delphi-Quellcode:
Also ich bin in der DLL und brauche davon nix mehr da alle funktionen als eine einzige aus der DLL
Nein. Die brauchst du ja, da sie aus der DLL kommen.
exportiert werden sollen. Die DLL ist in Delphi geschrieben. ;) gruss Emil |
Re: Neustrukturierung einer DLL
Ok...könntest du mir mal den DLL-Code zukommen lassen. Sonst kommen wir glaub ich auf keinen grünen Zweig (mein ICQ läuft :))
|
Re: Neustrukturierung einer DLL
Zitat:
Und du müßtest mir garantieren ihn in keiner weise zu veröffentlichen ;) Den rest können wir dann über ICQ besprechen. gruss Emil |
Re: Neustrukturierung einer DLL
Veröffentlichen werde ich ihn (den Source) garantiert nicht. :) Dafür bin ich zu ehrlich :)
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:25 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 by Thomas Breitkreuz