![]() |
Re: Dynamisches Array oder Klasse als Array auslegen
Zitat:
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 |
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 |
Re: Dynamisches Array oder Klasse als Array auslegen
Zitat:
Delphi-Quellcode:
Ist das gleiche wie im C++ code WinampDSP da wird kein pointer auf die Adresse gesetzt.
TDspPtrArray = array [0..0] of WINAMPPLUGINPROPDSP;
DspPtrArray = ^TDspPtrArray; Winamp_DSP : DspPtrArray = nil; 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:
Wie komme ich auf die Adresse des Moduls? ohne AV
// 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; IN Load hat es so funktioniert
Delphi-Quellcode:
gruß
pGetMod : function : pointer; stdcall;
pGetMod := GetProcAddress(winampDsp^.hDll, 'winampDSPGetHeader2'); if pGetMod <> nil then |
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 |
Re: Dynamisches Array oder Klasse als Array auslegen
Zitat:
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 |
Re: Dynamisches Array oder Klasse als Array auslegen
Zitat:
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:
freigegeben wurde. Deshalb konnte 'winampDsp^.pModule' nicht mehr initialisiert werden weil NIL.
end else
// Bei Fehler Winamp Fake Window beenden Destroy_Winamp_Window(winampDsp); end; // Library freigeben FreeLibrary(winampDsp^.hDll); 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:
So kann 'if pGetMod <> nil then' pGetMod die Library leeren wenn = NIL. |
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:
Im Original wird diese Zeile
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;
Delphi-Quellcode:
so dargestellt.
EnterCriticalSection(winampDsp^.csH);
Code:
Wäre übersetzt
EnterCriticalSection(&winampDsp->csH);
Delphi-Quellcode:
So wie es oben ist gibt es einen AV nehme ich die übersetzte zeile
EnterCriticalSection(@winampDsp^.csH);
bekomme ich die Meldung Zitat:
Ausgelegt ist sie in der Classe.
Delphi-Quellcode:
Was ist hier verkehrt das diese Meldung auftritt ?
csH : RTL_CRITICAL_SECTION;
Gruß |
Re: Dynamisches Array oder Klasse als Array auslegen
Guten Morgen @all
Delphi-Quellcode:
Wie kann ich erreichen das bei der übergabe des '@' Operators an
//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; 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:
Gruß |
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:
Delphi kapselt dieses kernel object übrigens in der Komponente TCriticalSection.
EnterCriticalSection(PRTLCriticalSection(winampDsp^.csh)^);
Grüße vom marabu |
Re: Dynamisches Array oder Klasse als Array auslegen
Zitat:
Delphi-Quellcode:
oder verwechsele ich das jetzt?
csH : ^TCriticalSection; // CRITICAL_SECTION
Danke wiedermal für deine Hilfe. Grüße aus Kölle am ring. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 23:06 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-2025 by Thomas Breitkreuz