Delphi-PRAXiS
Seite 4 von 6   « Erste     234 56      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Dynamisches Array oder Klasse als Array auslegen (https://www.delphipraxis.net/77666-dynamisches-array-oder-klasse-als-array-auslegen.html)

EWeiss 25. Sep 2006 18:11

Re: Dynamisches Array oder Klasse als Array auslegen
 
Zitat:

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

marabu 25. Sep 2006 18:29

Re: Dynamisches Array oder Klasse als Array auslegen
 
Die observierte Zeile in Bild-1 - muss es da nicht winamp_DSP^[a] heißen? Prüfe das mal.

Gruß, marabu

EWeiss 25. Sep 2006 18:41

Re: Dynamisches Array oder Klasse als Array auslegen
 
Zitat:

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ß

marabu 25. Sep 2006 19:01

Re: Dynamisches Array oder Klasse als Array auslegen
 
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

EWeiss 25. Sep 2006 19:07

Re: Dynamisches Array oder Klasse als Array auslegen
 
Zitat:

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

EWeiss 25. Sep 2006 19:16

Re: Dynamisches Array oder Klasse als Array auslegen
 
Zitat:

Zitat von EWeiss
Zitat:

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.

EWeiss 25. Sep 2006 20:19

Re: Dynamisches Array oder Klasse als Array auslegen
 
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
Delphi-Quellcode:
EnterCriticalSection(winampDsp^.csH);
so dargestellt.

Code:
EnterCriticalSection(&winampDsp->csH);
Wäre übersetzt
Delphi-Quellcode:
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.

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

Gruß

EWeiss 26. Sep 2006 06:36

Re: Dynamisches Array oder Klasse als Array auslegen
 
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ß

marabu 26. Sep 2006 07:02

Re: Dynamisches Array oder Klasse als Array auslegen
 
Guten Morgen Emil.

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

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

Grüße vom marabu

EWeiss 26. Sep 2006 07:11

Re: Dynamisches Array oder Klasse als Array auslegen
 
Zitat:

Delphi kapselt dieses kernel object übrigens in der Komponente TCriticalSection.
Wäre dann nicht eigentlich die richtige zuweisung von csh
Delphi-Quellcode:
csH                      : ^TCriticalSection;         // CRITICAL_SECTION
oder verwechsele ich das jetzt?

Danke wiedermal für deine Hilfe.
Grüße aus Kölle am ring.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:25 Uhr.
Seite 4 von 6   « Erste     234 56      

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