Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Neustrukturierung einer DLL (https://www.delphipraxis.net/95353-neustrukturierung-einer-dll.html)

EWeiss 5. Jul 2007 13:41


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:
//'--------------------------- 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.
gruss Emil

Robert Marquardt 5. Jul 2007 13:53

Re: Neustrukturierung einer DLL
 
Na mach als ersten Parameter aller Funktionen eine ID.
Delphi-Quellcode:
const
  BASSVIS_SONIQUE = 1;
  BASSVIS_WINAMP = 2;
  BASSVIS_WMP    = 3;
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.
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.

EWeiss 5. Jul 2007 14:11

Re: Neustrukturierung einer DLL
 
Zitat:

Zitat von Robert Marquardt
Na mach als ersten Parameter aller Funktionen eine ID.
Delphi-Quellcode:
const
  BASSVIS_SONIQUE = 1;
  BASSVIS_WINAMP = 2;
  BASSVIS_WMP    = 3;
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.
.

Wie meinst du das mit SuperSet wie sollte das aussehen.
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:

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.
Geht nicht da ein FakeWindow nur für bestimmte Plugins von nöten sind dieses wird nicht grundsätzlich generiert.
Der User muss also zugriff darauf haben und selbst bestimmen können ob er das abhängig von seiner Anwendung erstellen will.

Zitat:

BTW deklariere 'bass_vis.dll' als Konstante und verwende sie. Das spart ein bischen, da dann der String nur einmal vorhanden ist
Du meinst
Delphi-Quellcode:
Const
BASSVIS_API : String = 'BassVis.Dll'
welchen vorteil bringt mir das ? bzw.. was spart das.

Robert Marquardt 5. Jul 2007 14:24

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:
const
  BassVisDllName = 'bass_vis.dll';
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.

EWeiss 5. Jul 2007 14:40

Re: Neustrukturierung einer DLL
 
Hi Robert
Zitat:

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.
Bitte benenne mir einige damit ich es in zukunft besser machen kann ;)
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:

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.
Nein ein Fenster welches dem jeweiligen Plugin zugewiesen wird das es für seine eigenschaften benötigt.
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:

Ich meinte
Delphi-Quellcode:
const
  BassVisDllName = 'bass_vis.dll';

Ja ok wie man es letztendlich benennt ist egal ;)
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:

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
Ok das kann ich nachvollziehen.

Wie meinst du das mit SuperSet wie sollte das aussehen. :?:

das *.h File sieht so aus und wie gesagt bisher keine fehler gemeldet!
Code:
#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
gruss Emil

Robert Marquardt 5. Jul 2007 15:05

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.

EWeiss 5. Jul 2007 15:38

Re: Neustrukturierung einer DLL
 
Hi Robert erstmal Danke für das auseinandernehmen der API ;)

Zitat:

// (rom) warum nicht THandle?
HVIS = DWORD;
Weil unter Bass HVIS auch als DWORD deklariert ist!
Und der Wert nichts mit einem THandle zu tun hat.

Delphi-Quellcode:
Result := DWORD(Vismod[moduleNum]);
Zitat:

// (rom) aussagekraeftige Parameternamen verwenden
Was verstehst du darunter?
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:

// (rom) Boolean ist fast sicher falsch. Boolean ist ein 1-Byte-Typ. Vermutlich ist BOOL gemeint.
Reicht für TRUE,FALSE nicht 1-Byte -Typ? mehr ist das doch nicht
Brauche werde LongBool noch WordBool

Zitat:

ByteBool / Boolean = 1 Byte true oder false boolescher Wert
WordBool = 2 Byte true oder false boolescher Wert
LongBool = 4 Byte true oder false boolescher Wert
Zitat:

// (rom) Der korrekte Typ fuer ein Fenster-Handle ist HWND.
theoretisch ;)
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:

// (rom) HWND oder HVIS (vermutlich HVIS).
procedure BASS_WINAMPVIS_Play(handle: DWORD); stdcall; external 'bass_vis.dll';
handle ist die allgemeine Variable für HVIS unter Bass da weiss jeder was damit gemeint ist.
Deshalb auch hier nicht HVIS (könnte man aber ändern)

Zitat:

// (rom) warum wird kein BOOL zurueckgeliefert?
function BASS_WINAMPVIS_IsPlaying(handle: DWORD):integer; stdcall; external 'bass_vis.dll';
Deshalb nicht weil es hier um Integer werte und nicht um bool geht.
1 = Play, 0 = stop, 3 = pause

gruss Emil

Robert Marquardt 5. Jul 2007 16:11

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.

EWeiss 5. Jul 2007 16:28

Re: Neustrukturierung einer DLL
 
Zitat:

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).
Da bin ich variabel könnt es im .h file ja nach boolean umbenennen wäre auch kein Beinbruch wenn in c möglich
Das -h file habe ich ja selbst erstellt kann da also ändern was ich will ;)

Zitat:

f, w, h sind keine aussagekraeftige Namen.
korrekt;)

Zitat:

Immer den korrekten Typ verwenden, HWND bzw HVIS. Das macht das API verstaendlicher.
Ok kann ich ändern.

Zitat:

VB steht hier nicht zur Debatte.
Doch denn meine App ist in VB geschrieben die möchte ich gerne noch mit meiner Lib in Delphi geschrieben verwenden.
Da muss ich also darauf achten das auch übergebene variabeln aus Delphi dort funktionieren.

Zitat:

BASS_WINAMPVIS_PlayState waere besser.
Richtig .. Werde ich ebenfalls übernehmen
Dann aber
BASS_WINAMPVIS_GetPlayState da ich ihn erfragen will nur BASS_WINAMPVIS_PlayState
würde bei mir eine übergabe vorraussetzen.

gruss Emil

EWeiss 6. Jul 2007 07:49

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:
Type
BassVisTypes = (Winamp, Sonique, WinMediaplayer)

VisTyes : BassVisTypes;
Wenn eine neue Instanz von außen erstellt wird wie müßte die classe am besten generiert werden
class(Tcomponent) oder wie ?
Im moment verwende ich eine classe
Delphi-Quellcode:
TBASSVis = class(TComponent)
wenn möglich sollte diese erhalten bleiben aber aus der anderen gesteuert werden können.

Jaja mir fehlt noch einiges an wissen ;) Deshalb frage ich ja.

gruss Emil

Robert Marquardt 6. Jul 2007 08:26

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:
#define BASSVIS_SONIQUE 1
#define BASSVIS_WINAMP 2
#define BASSVIS_WMP    3

typedef int BASSVIS_KIND_T;
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.

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:
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;
Das ist jetzt nur die grobe Richtung in der es gehen soll. Das API muss noch deutlich vereinheitlicht werden.

EWeiss 6. Jul 2007 08:48

Re: Neustrukturierung einer DLL
 
Zitat:

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;

Meine Idee war halt es als Enum eg.. wie in VB zu deklarieren
Da ich dann über ein untermenü verfüge und bei case anweisungen die deklarierte Type
als vergleich nehmen kann.

Zitat:

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:
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;

ja da komme ich mit klar.

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:
    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
Wenn ich hier die DLL aufrufe
Code:
        'Create the new bass wrapper if playback started
        m_VisWrapper = New BASSVis_Wrapper.BassVisWrapper(Application.StartupPath & "\plugins\", m_CurrentType, Me.Handle, pbVisuals, m_Mixer)
dann erstellt m_VisWrapper eine neue Instanz und die eigenschaften der DLL können dann über m_VisWrapper
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:
    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
Mir geht es um das Problem der Initialisierung und der automatischen zerstörung der Instanz
wenn der VisTyp geändert wird.

gruss und danke für die Infos Emil

Robert Marquardt 6. Jul 2007 09:03

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.

EWeiss 6. Jul 2007 09:25

Re: Neustrukturierung einer DLL
 
Zitat:

Zitat von Robert Marquardt
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.

Ja und darum geht es dies ist der grund das ich die Lib umschreiben möchte.
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

EWeiss 6. Jul 2007 12:03

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:
destructor TBASSVis.Destroy;
Kann ich die INIT Routine so belassen wenn ich zu dieser funktion das Kind addiere?
Und den Namen BASS_WINAMPVIS_Init nach BASSVIS_Init umbenenne.
Delphi-Quellcode:
function BASSVIS_Init(Kind: BASSVIS_KIND_T; AppHandle: DWORD; WinHandle: DWORD): boolean; stdcall;
theoretisch müßte ja dann bei jeden neuen aufruf von INIT zuerst Destroy ausgelößt werden
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

Ghostwalker 6. Jul 2007 15:06

Re: Neustrukturierung einer DLL
 
Warum willst du verhindern, das jemand mehrere unterschiedliche Plugin's gleichzeitig verwendet ?

EWeiss 6. Jul 2007 15:23

Re: Neustrukturierung einer DLL
 
Zitat:

Zitat von Ghostwalker
Warum willst du verhindern, das jemand mehrere unterschiedliche Plugin's gleichzeitig verwendet ?

Resourcen bedingt.

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

Ghostwalker 6. Jul 2007 16:15

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:

   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;
So kannst du alle Funktionen die notwendig sind, globalisieren.

EWeiss 6. Jul 2007 16:28

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:
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.
gruss Emil

Ghostwalker 6. Jul 2007 16:36

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 ?

EWeiss 6. Jul 2007 16:48

Re: Neustrukturierung einer DLL
 
Zitat:

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

Ghostwalker 6. Jul 2007 17:16

Re: Neustrukturierung einer DLL
 
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 :))

Robert Marquardt 6. Jul 2007 18:22

Re: Neustrukturierung einer DLL
 
Na dann doch besser ein FreeAndNil(BASSVis1); und FreeAndNil(BASSWMPVis1); ohne irgendwelche IFs.

EWeiss 7. Jul 2007 02:36

Re: Neustrukturierung einer DLL
 
@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

Ghostwalker 7. Jul 2007 06:02

Re: Neustrukturierung einer DLL
 
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 :)

EWeiss 7. Jul 2007 09:59

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:
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

Ghostwalker 7. Jul 2007 10:40

Re: Neustrukturierung einer DLL
 
Ähm..um weitere Missverständnisse mal vorzubeugen. Ich bau dir mal eine Beispielunit wie das mit dem Superset gedacht ist :)

EWeiss 7. Jul 2007 10:41

Re: Neustrukturierung einer DLL
 
Zitat:

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

Ghostwalker 7. Jul 2007 13:03

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ß).

EWeiss 7. Jul 2007 13:16

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:

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

Ghostwalker 7. Jul 2007 13:18

Re: Neustrukturierung einer DLL
 
Wie du die Konstante benennst bleibt vollkommen dir überlassen. Den Namen hab ich mir einfach mal so ausgedacht. :)

EWeiss 7. Jul 2007 13:30

Re: Neustrukturierung einer DLL
 
Zitat:

Zitat von Ghostwalker
Wie du die Konstante benennst bleibt vollkommen dir überlassen. Den Namen hab ich mir einfach mal so ausgedacht. :)

Ah so gut ;) :-D
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

EWeiss 7. Jul 2007 17:33

Re: Neustrukturierung einer DLL
 
Habe da noch ein verständnis problem

Du schreibst
Delphi-Quellcode:
procedure BASSVIS_Execute(Para:TExecutePara);
Verstehe ich nun nicht so recht :?:
Denn genau diese Funktion sollte exportiert und der ganze andere Kram gelöscht werden.

Das soll dann gelöscht werden
Delphi-Quellcode:
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;
Also eine Funktion für drei.

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:
BASSVIS_ExecuteVis(Kind: BASSVIS_KIND_T; PluginName: PChar; moduleNum: integer; ownHdc: boolean; ownHdcW2: boolean):HVIS; stdcall;
und intern die Originale function umbenennen eg..
ExecuteWinampVis(PluginName: PChar; moduleNum: integer; ownHdc: boolean; ownHdcW2: boolean): HVIS;

kann dann beim vergleich wenn der Type(Kind) Winamp ist
Delphi-Quellcode:
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;
in die umbenannte/alte function springen
Anders gehts glaube ich nicht.

gruss Emil

Ghostwalker 7. Jul 2007 17:58

Re: Neustrukturierung einer DLL
 
Zitat:

Zitat von EWeiss
Habe da noch ein verständnis problem

Du schreibst
Delphi-Quellcode:
procedure BASSVIS_Execute(Para:TExecutePara);
Verstehe ich nun nicht so recht :?:
Denn genau diese Funktion sollte exportiert und der ganze andere Kram gelöscht werden.

Löschen mußt du garnichts :) und exportieren nur dann wenn du das direkt in die DLL einbauen willst.

Zitat:

Zitat von EWeiss
Das soll dann gelöscht werden
Delphi-Quellcode:
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;

Nein. Die brauchst du ja, da sie aus der DLL kommen.

Zitat:

Zitat von EWeiss
Also eine Funktion für drei.

Aber alle Funktionen der verschiedenen Typen mit obiger procedure ausführbar sein.

Nicht ganz. Ich kapsle drei Funktionen über einen Funktionsaufruf. Damit braucht sich
der Anwender keinen Kopf machen, welche Funktion er denn für ein Plugin er nun aufrufen muß,
da es immer die gleiche ist :)

Zitat:

Zitat von EWeiss
Ich müßte sie dann so umschreiben wie diese
Delphi-Quellcode:
BASSVIS_ExecuteVis(Kind: BASSVIS_KIND_T; PluginName: PChar; moduleNum: integer; ownHdc: boolean; ownHdcW2: boolean):HVIS; stdcall;

Nein, brauchst du nicht. Der Parameter KIND wird ja beim INIT-Aufruf bereits angegeben (und intern gespeichert). Analog dazu HVIS, da immer nur ein Plugin aktiv sein kann. Die restlichen Parameter
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 ?

EWeiss 7. Jul 2007 18:10

Re: Neustrukturierung einer DLL
 
Ich sage ja wir haben ein verständnis Problem ;)
Zitat:

Löschen mußt du garnichts und exportieren nur dann wenn du das direkt in die DLL einbauen willst.
Das ist alles in der DLL
Ich befinde mich in der DLL und will diese Funktionen aus der DLL exportieren.

Delphi-Quellcode:
Nein. Die brauchst du ja, da sie aus der DLL kommen.
Also ich bin in der DLL und brauche davon nix mehr da alle funktionen als eine einzige aus der DLL
exportiert werden sollen.

Die DLL ist in Delphi geschrieben. ;)

gruss Emil

Ghostwalker 7. Jul 2007 18:14

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 :))

EWeiss 7. Jul 2007 18:24

Re: Neustrukturierung einer DLL
 
Zitat:

Zitat von Ghostwalker
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 :))

Muss erst zusammen suchen ;)
Und du müßtest mir garantieren ihn in keiner weise zu veröffentlichen ;)

Den rest können wir dann über ICQ besprechen.

gruss Emil

Ghostwalker 7. Jul 2007 18:27

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