Delphi-Quellcode:
Werde es mir genau ansehen und vergleichen im Quelltext-
Dann ein gutes Nächtele man schreibt sich.
Ich denke das Problem lokalisiert zu haben.
Wie angenommen liegt es immer noch an AddDSP
Der Lokale Zähler welcher die Plugins
incrementiert? wird nicht hochgerechnet.
Ist der grund das mir überall falsche werte angezeigt werden.
Original
Code:
void AddDSP(WINAMPPLUGINPROPDSP *winampDsp)
{
DWORD a;
for (a=0;a<winampDSPcounter;a++)
if (!winampDSP[a]) break;
if (a==winampDSPcounter)
{
// no empty slot, so add a new one
winampDSP = (WINAMPPLUGINPROPDSP**)realloc(winampDSP, (winampDSPcounter+1)*sizeof(WINAMPPLUGINPROPDSP*));
winampDSPcounter++;
}
winampDsp->
handle = ++winampDSPhandle;
// insert the new Winamp DSP
winampDSP[a] = winampDsp;
}
Dieser zähler
winampDSPcounter++; wird nie angeprochen
Übersetzt
Delphi-Quellcode:
Procedure AddDSP(winampDsp: WINAMPPLUGINPROPDSP);
stdcall;
var
a: DWORD;
begin
// Habe ich addiert weil bei 'if not Assigned(Winamp_DSP[a])' immer ein AV auftrat
// Kann aber nicht stimmen da im C++ auch nicht enthalten.
Winamp_DSP := DspPtrArray(winampDsp);
for a := 0
to winampDSPcounter
do
// Wenn oben auskommentiert gibts hier einen AV
if not Assigned(Winamp_DSP[a])
then
Break;
if a = winampDSPcounter
then
begin
// Kein leerer Speicherbereich, einen neuen hinzufügen
ReallocMem(Winamp_DSP, (winampDSPcounter + 1) * SizeOf(WINAMPPLUGINPROPDSP));
// Bin nicht sicher ob DEC oder INC da dies ein Postfix-Operator in c++ ist:
// Denke aber da hier nur ein Wert steht, er hochzählen soll.
// Wird der zähler nicht verwendet funktioniert der ganze Code nicht
// In fast jeder Function wird dieser mit a verglichen.
Inc(winampDSPcounter);
end;
Inc(winampDSPhandle);
winampDsp^.handle := winampDSPhandle;
// addiere ein Winamp DSP Plugin zum Array (im neuangelegten leeren Speicherbereich)
Winamp_DSP[a] := winampDsp;
end;
Im grunde geht es jetzt nur um diese eine Zeile.
Code:
if (!winampDSP[a]) break;
Delphi-Quellcode:
if not Assigned(Winamp_DSP[a]) then
Break;
Kann irgendwie nicht stimmen, weil so, wenn ich in Break hineinspringe, 'a' um eins hochgezählt wird.
'a = winampDSPcounter' kann also niemals eintreten. a wird immer um einen zähler höher sein.
Das Resultat ist das winampDSPcounter immer 0 ist.
Dies hat wiederum zur folge das ich keine richtigen werte im Speicher finde da sie nicht
an der richtigen position stehen und kein Speicherbereich dafür bereitgestellt wurde.
Auch die FakeWindows welche von dem Zähler abhängig sind werden nicht korrekt erstellt.
AppClass := PChar(Format(Pchar('Winamp v1.x : %d'), [winampDSPcounter + 1]));
Der KlassenName wird ja um den wert '%d' mit dem winampDSPcounter hochgezählt.
Grüße Emil