-
Forum: Programmieren allgemein
by marabu,
28. Sep 2006
Hallo Emil,
ich hatte einen blöden Fehler in der Suchschleife. Ich habe ihn im Beitrag #55 korrigiert. Zu deiner Frage bezüglich ReallocMem(): Der Speicher wird auf seine neue Größe gebracht, der alte Inhalt wird automatisch beibehalten - zur Not per copy, falls kein inplace resizing möglich war. Der Zeiger muss call-by-reference sein, damit bei einer Verschiebung an eine andere Adresse der...
-
Forum: Programmieren allgemein
by marabu,
28. Sep 2006
Guten Morgen Emil,
du hast Recht - die Prozedur AddDSP() ist fehlerhaft. Zuerst musst du die Initailsierung von winampDSPcounter sicher stellen:
// unit BassWaDSP;
var
winampDSPcounter : DWORD = 0;
Dann müssen ein paar Änderungen an der Prozedur AddDSP() vorgenommen werden:
-
Forum: Programmieren allgemein
by marabu,
27. Sep 2006
Emil, ich bin sehr müde, aber das hier erkenne ich, wenn ich deinen Beitrag #50 sequentiell durchgehe:
function BASS_WADSP_Load(const dspfile: PChar; x, y, Width, Height: integer;
proc: WINAMPWINPROC): HDSP; stdcall;
var
winampDsp: WINAMPPLUGINPROPDSP;
cnt: integer;
begin
// so holst du dir nur 4 Byte Speicher für einen Pointer:
-
Forum: Programmieren allgemein
by marabu,
27. Sep 2006
Wie kann ich mir mal einen Gesamtüberblick verschaffen? Bin mittlerweile auch etwas orientierungslos. Testen kann ich nicht, aber einen code-walk-through kann ich dir anbieten, wenn du Geduld hast. Muss nebenher auch was arbeiten.
Grüße, marabu
-
Forum: Programmieren allgemein
by marabu,
27. Sep 2006
Moin Emil,
wo geschieht denn die falsche Zuweisung?
Gruß
-
Forum: Programmieren allgemein
by marabu,
26. Sep 2006
Ich habe noch mal ganz zum Anfang zurück geblättert und festgestellt, dass csH in winampDSPinfo ursprünglich als TRTLCriticalSection verbaut war - also nix mit Pointer. Warum bist du davon abgekommen? Du kannst das ruhig so beibehalten.
Grüße, marabu
-
Forum: Programmieren allgemein
by marabu,
26. Sep 2006
Zumindest bei mir unter D7 besser so:
csh: PRTLCriticalSection;
Grüße, marabu
-
Forum: Programmieren allgemein
by marabu,
26. Sep 2006
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
-
Forum: Programmieren allgemein
by marabu,
25. Sep 2006
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
-
Forum: Programmieren allgemein
by marabu,
25. Sep 2006
Die observierte Zeile in Bild-1 - muss es da nicht winamp_DSP^ heißen? Prüfe das mal.
Gruß, marabu
-
Forum: Programmieren allgemein
by marabu,
25. Sep 2006
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...
-
Forum: Programmieren allgemein
by marabu,
25. Sep 2006
Hallo Emil,
kann es nicht sein, dass der Rückgabewert von GetDSP ein Zeiger PWinampPluginPropDsp ist? Außerdem bist du eventuell in eine weitere Falle getappt: während in C++ die function mit der Rückgabe eines Wertes verlassen wurde, verbleibt Object Pascal im code block, auch wenn du der Pseudo Variable Result etwas zugewiesen hast.
Grüße vom marabu
-
Forum: Programmieren allgemein
by marabu,
24. Sep 2006
Das von dir ausgemachte Problem existiert nicht. Wenn ich nichts übersehen habe, dann müsstest du bei einem code-walk-through feststellen, dass beim Scheitern von Create_Winamp_Window() die Routine Destroy_Winamp_Window() aufgerufen wird, wie vorher auch schon.
marabu
-
Forum: Programmieren allgemein
by marabu,
24. Sep 2006
Schau mal:
begin
// ...
// Exceptions zurück auf Defaultwert
Set8087CW(Saved8087CW);
Result := 0; // spätestens hier initialisieren
-
Forum: Programmieren allgemein
by marabu,
24. Sep 2006
Um dem Compiler Entwarnung zu geben: Nimm die Zuweisung von 0 an Result aus dem äußeren ELSE-Zweig weg und stelle sie ohne Bedingung vor das IF Statement.
marabu
-
Forum: Programmieren allgemein
by marabu,
24. Sep 2006
Guten Morgen.
winampDsp->handle = ++winampDSPhandle;
Das entspricht:
// durch den vorangestellten Operator ++ zuerst erhöhen:
Inc(winampDSPhandle);
// dann zuweisen:
winampDsp^.handle := winampDSPhandle;
-
Forum: Programmieren allgemein
by marabu,
23. Sep 2006
Wenn du den Quelltext nur mir zuschickst, dann übst du moralischen Druck auf mich aus und ich muss dich vielleicht trotzdem enttäuschen. Stelle den Quelltext doch in diesen thread ein - dann können dir auch andere helfen, falls ich überraschend verscheide oder meine Frau mir mit dem Baseballschläger den Zugang zum PC verwehrt. Ist das ein deal?
Freundliche Grüße
marabu
PS: So ein...
-
Forum: Programmieren allgemein
by marabu,
23. Sep 2006
Du hattest in deinem Eröffnungsbeitrag aus dem C++ Code zitiert:
WINAMPPLUGINPROPDSP **winampDSP = NULL;
Wenn du den Namen für deine globale Variable in Object Pascal beibehalten willst, dann so:
var
winampDSP: PPWinAmpPluginPropDSP; // siehe Beitrag #2
Allerdings darf dann der Parameter der Prozedur nicht winampDSP heißen, da die C++ Bezeichner wegen der case sensitivity nicht 1:1...
-
Forum: Programmieren allgemein
by marabu,
23. Sep 2006
Eher so:
begin
DspPtrArray := gWinampDSP; // natürlich die globale Variable !!
// ...
end;
Ich weiß nicht wie du den Namenskonflikt aufgelöst hast.
-
Forum: Programmieren allgemein
by marabu,
23. Sep 2006
Du musst diesen Zeiger tatsächlich vor seiner ersten Verwendung initialisieren, indem du ihm den Wert des Zeigers winampDSP (so war der Name der globalen Variablen im C++ Code) zuweist. Nur so wird schließlich die Redefinition des Speicherbereichs erreicht, damit du über array zugreifen kannst.
marabu
-
Forum: Programmieren allgemein
by marabu,
22. Sep 2006
Deine Umsetzung ist nicht korrekt. Insbesondere sind winampDsp und winampDSP nicht das gleiche. Hoffentlich bist du nicht schon an anderen Stellen in diese Falle getappt.
procedure AddDSP(dsp: PWinampDSPInfo);
type
TDspPtrArray = array of PWinampPluginPropDSP;
PDspPtrArray = ^TDspPtrArray;
var
i: DWORD;
winampDSP: PDspPtrArray;
-
Forum: Programmieren allgemein
by marabu,
22. Sep 2006
Hallo,
es wird hier nur ein typisierter Zeiger deklariert und mit NULL initialisiert, wenn ich nicht irre.
Hier bin ich mit dir einer Meinung.
Der Zugriff kann über Zeiger-Arithmetik erfolgen oder durch Überlagerung des Speicherbereiches mit einem Array. Vielleicht verhilft dir ein wenig Code zur Erkenntnis?