AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Dynamisches Array oder Klasse als Array auslegen
Thema durchsuchen
Ansicht
Themen-Optionen

Dynamisches Array oder Klasse als Array auslegen

Ein Thema von EWeiss · begonnen am 22. Sep 2006 · letzter Beitrag vom 30. Sep 2006
Antwort Antwort
Seite 4 von 6   « Erste     234 56      
EWeiss
(Gast)

n/a Beiträge
 
#31

Re: Dynamisches Array oder Klasse als Array auslegen

  Alt 25. Sep 2006, 19:11
Zitat von marabu:
Result ist eine Pseudo-Variable, sie steht für den Funktionsrückgabewert. Du könntest genausogut den Rückgabewert an den Funktionsnamen übergeben, was aber nicht so wartungsfreundlich ist. Die Funktion wird dabei aber nicht beendet, wie z.B. bei der Anweisung return in C. Soweit die Begriffsklärung. Näheres findest du in der Delphi Online-Hilfe. Hier mein Versuch einer Umsetzung - ohne doppelte Negation:

Delphi-Quellcode:
function GetDSP(handle: DWORD): WINAMPPLUGINPROPDSP;
var
  i: DWORD;
begin
  if handle <> 0 then
    for i := 0 to Pred(winampDSPcounter) do
    begin
      Result := Winamp_DSP^[i];
      if Assigned(Result) and (Result^.handle = handle)
        then Exit;
    end;
  Result := nil;
  // GetDSP := nil // gleichwertig
end;
Gruß

marabu
Also bei dir sieht es schon mal gut aus der zweite Durchlauf der Schleife würde zum erfolg
führen wenn bei der abfrage nach dem Modul nicht ein AV auftreten würde.

Hier sind mal ein paar kleine pics der reihe nach was bei mir abgeht.

Am wichtigsten sind 3 und 4 die Addresse wird noch richtig angezeigt so wie von
AddDSP an BASS_WADSP_Load übergeben
Winamp_DSP zeigt auch noch den richtigen wert.
Aber die Adresse wird wie im nächsten Pic zu sehen von Winampdsp nicht richtig angenommen.

Liebe grüße
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#32

Re: Dynamisches Array oder Klasse als Array auslegen

  Alt 25. Sep 2006, 19:29
Die observierte Zeile in Bild-1 - muss es da nicht winamp_DSP^[a] heißen? Prüfe das mal.

Gruß, marabu
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#33

Re: Dynamisches Array oder Klasse als Array auslegen

  Alt 25. Sep 2006, 19:41
Zitat von marabu:
Die observierte Zeile in Bild-1 - muss es da nicht winamp_DSP^[a] heißen? Prüfe das mal.

Gruß, marabu

Delphi-Quellcode:
  TDspPtrArray = array [0..0] of WINAMPPLUGINPROPDSP;
  DspPtrArray = ^TDspPtrArray;
  Winamp_DSP : DspPtrArray = nil;
Ist das gleiche wie im C++ code WinampDSP da wird kein pointer auf die Adresse gesetzt.
Habe es aber mal getestet ergebnis ist das gleiche(AV)

Dein Code der letzte funktioniert 100 pro.
Denke es liegt nun daran das die adresse zum Modul nicht aufgelößt wird
da gibt es ein AV.

Delphi-Quellcode:
// Returns the name of a loaded Winamp DSP plugin
function BASS_WADSP_GetName(plugin: HDSP): LPTSTR; stdcall;
Var
  strRet: PChar;
  winampDSP: WINAMPPLUGINPROPDSP;

begin
  strRet := nil;
  winampDsp := GetDSP(plugin);
   if winampDsp <> nil then
   begin
      strRet := winampDsp^.pModule^.description;
   end;
   Result := strRet;
end;
Wie komme ich auf die Adresse des Moduls? ohne AV
IN Load hat es so funktioniert

Delphi-Quellcode:
    pGetMod : function : pointer; stdcall;
    pGetMod := GetProcAddress(winampDsp^.hDll, 'winampDSPGetHeader2');
    if pGetMod <> nil then
gruß
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#34

Re: Dynamisches Array oder Klasse als Array auslegen

  Alt 25. Sep 2006, 20:01
Wenn der Zugriff auf winampDsp^.hDll funktioniert, dann scheint der Zeiger winampDsp gesund zu sein. Was sagt denn der Debugger bei winampDsp^.pModule - ist der Zeiger eventuell nil? Hast du die Struktur irgendwo korrekt initialisiert?

Gruß, marabu
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#35

Re: Dynamisches Array oder Klasse als Array auslegen

  Alt 25. Sep 2006, 20:07
Zitat von marabu:
Wenn der Zugriff auf winampDsp^.hDll funktioniert, dann scheint der Zeiger winampDsp gesund zu sein. Was sagt denn der Debugger bei winampDsp^.pModule - ist der Zeiger eventuell nil? Hast du die Struktur irgendwo korrekt initialisiert?

Gruß, marabu
ja der Zeiger ist NIL
Deshalb meine Anmerkung wie ich die 'winampDsp^.pModule' Adresse auflösen kann.
Es siehst so aus das zum Modul der POinter fehlt.

PS: In VB braucht man diese ganze Pointer sache nur in seltenen fällen
Sorry wenn ich manchmal etwas dumm frage.
Werde es aber auf kurz oder lang begreifen.

Danke .. grüße
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#36

Re: Dynamisches Array oder Klasse als Array auslegen

  Alt 25. Sep 2006, 20:16
Zitat von EWeiss:
Zitat von marabu:
Wenn der Zugriff auf winampDsp^.hDll funktioniert, dann scheint der Zeiger winampDsp gesund zu sein. Was sagt denn der Debugger bei winampDsp^.pModule - ist der Zeiger eventuell nil? Hast du die Struktur irgendwo korrekt initialisiert?

Gruß, marabu
ja der Zeiger ist NIL
Deshalb meine Anmerkung wie ich die 'winampDsp^.pModule' Adresse auflösen kann.
Es siehst so aus das zum Modul der POinter fehlt.

PS: In VB braucht man diese ganze Pointer sache nur in seltenen fällen
Sorry wenn ich manchmal etwas dumm frage.
Werde es aber auf kurz oder lang begreifen.

Danke .. grüße
Ahhhhhh ... Erfolg
Dein Hinweis auf winampDsp^.hDll hat mich den code nochmal überprüfen lassen.
Es lag ganz einfach daran das unter Load BASS_WADSP_Load

Delphi-Quellcode:
      end else
        // Bei Fehler Winamp Fake Window beenden
        Destroy_Winamp_Window(winampDsp);
    end;
    // Library freigeben
     FreeLibrary(winampDsp^.hDll);
freigegeben wurde. Deshalb konnte 'winampDsp^.pModule' nicht mehr initialisiert werden weil NIL.
Da nach BASS_WADSP_GetName keine weitere Funktion zum einladen mehr benötigt wird
sollte ich diese Zeile 'FreeLibrary(winampDsp^.hDll)' wohl unter 'strRet := winampDsp^.pModule^.description;' setzen.

gruß

PS: Letzte feststellung war quatch
Zitat:
sollte ich diese Zeile 'FreeLibrary(winampDsp^.hDll)' wohl unter 'strRet := winampDsp^.pModule^.description;' setzen.
Habe einfach aus end; end else gemacht
So kann 'if pGetMod <> nil then' pGetMod die Library leeren wenn = NIL.
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#37

Re: Dynamisches Array oder Klasse als Array auslegen

  Alt 25. Sep 2006, 21:19
Bis GetName funktioniert nun alles.
Mein neues problem ist nicht ganz so aufwendig denke ich!

Delphi-Quellcode:
procedure Destroy_Winamp_Window(winampDsp: WINAMPPLUGINPROPDSP); stdcall;
begin

       EnterCriticalSection(winampDsp^.csH);

      if winampDsp^.DSP_Window_Emu <> 0 then
         DestroyWindow(winampDsp^.DSP_Window_Emu);
      if winampDsp^.DSP_Atom_Emu <> 0 then
         UnRegisterClass(PChar(WORD(winampDsp^.DSP_Atom_Emu)), Inst);

      winampDsp^.DSP_Atom_Emu := 0;
      winampDsp^.DSP_Window_Emu := 0;

      LeaveCriticalSection(winampDsp^.csH);

end;
Im Original wird diese Zeile
EnterCriticalSection(winampDsp^.csH); so dargestellt.

Code:
EnterCriticalSection(&winampDsp->csH);
Wäre übersetzt
EnterCriticalSection(@winampDsp^.csH); So wie es oben ist gibt es einen AV nehme ich die übersetzte zeile
bekomme ich die Meldung

Zitat:
[Pascal Error] BassWaDSP.pas(330): E2033 Types of actual and formal var parameters must be identical
Der Operator '@' müßte ja die adresse der Variablen zurückliefern so wie ich das verstanden habe
Ausgelegt ist sie in der Classe.

csH : RTL_CRITICAL_SECTION; Was ist hier verkehrt das diese Meldung auftritt ?

Gruß
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#38

Re: Dynamisches Array oder Klasse als Array auslegen

  Alt 26. Sep 2006, 07:36
Guten Morgen @all

Delphi-Quellcode:
  //WinampDSPInfo Klasse
  WINAMPPLUGINPROPDSP = ^WINAMPPLUGINPROP_TAG_DSP;
  WINAMPPLUGINPROP_TAG_DSP = record
     csH : RTL_CRITICAL_SECTION; // CRITICAL_SECTION
     handle : DWORD;                      // DSP handle
     NumberOfModules : UINT;                      // number of modules in the dsp
     hDll : HWND;                // the dll instance
     pModule : PWinampDSPHeader;       // module header
     pDSP : PWinampDSPModule;       // current selected dsp module
     hchannel : DWORD;                      // channel associated to dsp
     module : Integer;                      // curent selected dsp module
     hdsp : HDSP;                         // optional dsp handle
     DSP_Window_Emu : HWND;             // related fake window handle
     DSP_Atom_Emu : ATOM;                   // related fake window atom
     songTitle : array[0..MAX_PATH-1] of char; // the playing song title
     fileName : array[0..MAX_PATH-1] of char; // the playing file name
     info : BASS_CHANNELINFO;       // channel info
  end;
Wie kann ich erreichen das bei der übergabe des '@' Operators an

EnterCriticalSection(@winampDsp^.csH);
kein AV auftritt ?

Also ohne Operator hängt sich die Anwendung auf oder es gibt ein AV.
EnterCriticalSection(winampDsp^.csH);
Mit Operator kommt diese Meldung!
Zitat:
[Pascal Error] BassWaDSP.pas(330): E2033 Types of actual and formal var parameters must be identical
Weiß jetzt nicht wie ich den Operator in der Classe einfügen muss damit die Meldung nicht mehr kommt.

Gruß
  Mit Zitat antworten Zitat
marabu

Registriert seit: 6. Apr 2005
10.109 Beiträge
 
#39

Re: Dynamisches Array oder Klasse als Array auslegen

  Alt 26. Sep 2006, 08:02
Guten Morgen Emil.

Bei csh: DWORD handelt es sich wahrscheinlich um einen Pointer auf die CRITICAL_SECTION Struktur. So könnte es funktionieren:

 EnterCriticalSection(PRTLCriticalSection(winampDsp^.csh)^); Delphi kapselt dieses kernel object übrigens in der Komponente TCriticalSection.

Grüße vom marabu
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#40

Re: Dynamisches Array oder Klasse als Array auslegen

  Alt 26. Sep 2006, 08:11
Zitat:
Delphi kapselt dieses kernel object übrigens in der Komponente TCriticalSection.
Wäre dann nicht eigentlich die richtige zuweisung von csh
csH : ^TCriticalSection; // CRITICAL_SECTION oder verwechsele ich das jetzt?

Danke wiedermal für deine Hilfe.
Grüße aus Kölle am ring.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 4 von 6   « Erste     234 56      


Forumregeln

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

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

Gehe zu:

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