Wenn du doch nochmal reinschauen willst: Was sagt denn der Debugger zu den Werten von Self
, FAudioSessionInfo
, etc? Steht da unter Umständen vielleicht schon "Müll" drinnen? Nur mit statischen Informationen ist es hier leider recht schwer die Fehlerquelle zu ermitteln.
Nein self ist die TAudioVolume Classe da steht kein Müll drin.
self und AudioSessionInfo siehe Anhang.
Ist schade aber so kann ich das Projekt nicht fertig stellen. sorry.
Ich habe zu wenig Erfahrung mit Threads so das ich den Fehler selber analysieren könnte.
Der Debugger ist in dem Fall nicht Hilfreich.
Ganz umsonst war das Projekt nicht habe 1>2 Fehler in meiner Library beheben können und eine neue Funktion addiert um zu vor erstellte
Kombinierte Objekte in einem rutsch zu löschen.
Delphi-Quellcode:
// Alle Objekte die mit diesen verbunden sind löschen
for I := 0 to Length(AudioVolumeArr) - 1 do
gSprSession.GD_DeleteLinkedObject(succ(ID_BVOLUME) + i); // neue Funktion
EDIT:
Habe meine Funktion nochmal optimiert
ändert aber nichts an meinem Pointer Problem doch das hier (AudioVolumeArr[M].Free;)
Delphi-Quellcode:
procedure TMainClass.SessionStateEvent(Sender: TCustomAudioVolume; NewState: integer);
var
IntI, K, M: integer;
ProcId: DWORD;
vProcList: TProcesses;
bFound: BOOL;
begin
bFound := false;
for IntI := 0 to Length(AudioVolumeArr) - 1 do
begin
if AudioVolumeArr[IntI] = Sender then
begin
ShowMessage(AudioVolumeArr[IntI].AudioSessionInfo(IntI).DisplayName + #13#10 +
'Index ' + IntToStr(IntI) + ' hat jetzt State ' + IntToStr(NewState));
ProcId := StrToInt(AudioVolumeArr[IntI].AudioSessionInfo(IntI).ProcessID);
if (ProcId <> 0) and (NewState = 0) then
begin
// ProcList initialisieren
vProcList := TProcesses.Create;
// Prozesse einlesen
vProcList.ReadSystem;
// prüfen ob aktiver prozess existiert
for K := 0 to vProcList.Count - 1 do
if vProcList[K].ID = ProcId then
begin
bFound := true;
// Raus hier
break;
end;
if not bFound then
begin
// Timer deaktivieren
KillTimer(HSprMaster, ID_MRENDER);
// Alle Objekte die mit diesen verbunden sind löschen
for M := 0 to Length(AudioVolumeArr) - 1 do
begin
gSprSession.GD_DeleteLinkedObject(succ(ID_BVOLUME) + M);
// TAudioVolume freigeben
AudioVolumeArr[M].Free;
end;
// Array löschen
SetLength(AudioVolumeArr, 0);
// Session erstellen
CreateSession;
// Window aktualisieren
gSprSession.GI_UpdateWindow(HSprSession, false);
// Timer aktivieren
SetTimer(HSprMaster, ID_MRENDER, 60, nil);
end;
// Prozessliste löschen
vProcList.Clear;
// Prozessliste freigeben
FreeAndNil(vProcList);
end;
end;
end;
end;
gruss