Einzelnen Beitrag anzeigen

EWeiss
(Gast)

n/a Beiträge
 
#12

Re: Neustrukturierung einer DLL

  Alt 6. Jul 2007, 07:48
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
  Mit Zitat antworten Zitat