![]() |
Re: Array , Löschen von selben verhindern.
Zitat:
Lediglich der Header und das Modul welche sich in PWinampVisInfo befindet werden aus dem Plugin geladen
Delphi-Quellcode:
aber auch diese haben nichts mit Winamp zu tun.VisHeader: PWinampVisHeader; VisModule: PWinampVisModule; Das Array selbst ist Privat. Gruß |
Re: Array , Löschen von selben verhindern.
Guten Morgen Emil,
eines ist sicher: der Fehler steckt nicht in den vier Zeilen Code, die du gezeigt hast. Mit denen forderst du nur Speicher an und initialisierst ihn. Interessanter ist dein Code, mit dem du nach dem Löschen eines Eintrags die nachfolgenden Einträge verschiebst. Eventuell wird dabei der Counter nicht rechtzeitig dekrementiert - oder garnicht?. Freundliche Grüße von Domstadt zu Domstadt |
DP-Maintenance
Dieses Thema wurde von "alcaeus" von "Programmieren allgemein" nach "Sonstige Fragen zu Delphi" verschoben.
|
Re: Array , Löschen von selben verhindern.
Zitat:
Ja .. das ist mein problem das redimensionieren (verschieben) der Einträge. Habe es mit ReAllocMem versucht und keinen Erfolg gehabt.
Delphi-Quellcode:
Wie schon gesagt es funktioniert alles (und ist keine übersetzung) von einer anderen Quelle
function BASS_WINAMPVIS_CreateVis(f: PChar; module, flags: DWORD; AppHandle: DWORD; AppHDC: boolean; VisCounter: integer): HVIS; stdcall;
var mbi: MEMORY_BASIC_INFORMATION; winampVisGetHeader: function: PWinampVisHeader; cdecl; begin Result := 0; // Winamp Emulator Fenster HWND VisDllHandle := 0; // Wenn True Plugin in der Applikation // oder eigenen Skin visualisieren AppParenthDC := AppHDC; // Voller Pfad des Plugin FileName := StrPas(f); // HWND von der ausführenden Application AppParentHandle := AppHandle; if (not FileExists(PChar(FileName))) then begin BassFuncs^.SetError(BASS_ERROR_FILEOPEN); Exit; end; if VisCounter = 0 then VisWinCounter := VisCounter; try GetMem(VisInfo[VisCounter], SizeOf(TWinampVisInfo)); ZeroMemory(VisInfo[VisCounter], SizeOf(TWinampVisInfo)); except BassFuncs^.SetError(BASS_ERROR_MEM); Exit; end; try SetCurrentDirectory(PChar(FileName)); VisDllHandle := LoadLibrary(PChar(FileName)); except if (VisDllHandle <> 0) then FreeLibrary(VisDllHandle); FreeMem(VisInfo[VisCounter]); BassFuncs^.SetError(BASS_ERROR_START); Exit; end; if (VisDllHandle = 0) then begin FreeMem(VisInfo[VisCounter]); BassFuncs^.SetError(BASS_ERROR_START); Exit; end; @winampVisGetHeader := GetProcAddress(VisDllHandle, 'winampVisGetHeader'); if (@winampVisGetHeader = nil) then begin FreeLibrary(VisDllHandle); FreeMem(VisInfo[VisCounter]); BassFuncs^.SetError(BASS_ERROR_HANDLE); Exit; end; VisInfo[VisCounter]^.VisHeader := winampVisGetHeader; if (VisInfo[VisCounter]^.VisHeader = nil) then begin FreeLibrary(VisDllHandle); FreeMem(VisInfo[VisCounter]); BassFuncs^.SetError(BASS_ERROR_START); Exit; end; VisInfo[VisCounter]^.VisModule := VisInfo[VisCounter]^.VisHeader^.getModule(module); if (VisInfo[VisCounter]^.VisModule = nil) then begin FreeLibrary(VisDllHandle); FreeMem(VisInfo[VisCounter]); BassFuncs^.SetError(BASS_ERROR_START); Exit; end; // Überprüfe ob eine neue Instanz erstellt werden soll VisInfo[VisCounter]^.Init := ((flags and BASS_VIS_NOINIT) <> BASS_VIS_NOINIT); VisInfo[VisCounter]^.DllInstance := VisDllHandle; if (VisInfo[VisCounter]^.Init) then begin VisWinCounter := VisCounter; VisInfo[VisWinCounter]^.VisInfoCount := VisWinCounter; // Neuen Thread erstellen ThreadHandle := BeginThread(nil, 0, @WinampVisWin, VisInfo[VisWinCounter], 0, ThreadId); // DLL aus Speicher entfernen wenn ThreadHandle = 0 if (ThreadHandle = 0) then begin FreeLibrary(VisDllHandle); FreeMem(VisInfo[VisWinCounter]); BassFuncs^.SetError(BASS_ERROR_INIT); Exit; end; // Thread schließen CloseHandle(ThreadHandle); end; VirtualQuery(VisInfo[VisCounter]^.VisHeader.description, mbi, SizeOf(MEMORY_BASIC_INFORMATION)); VisInfo[VisCounter]^.PluginId := DWORD(mbi.AllocationBase); W_AppendHandle(DWORD(VisInfo[VisCounter])); BassFuncs^.SetError(BASS_OK); Result := DWORD(VisInfo[VisCounter]); end; Hier
Delphi-Quellcode:
müßte der speicher verschoben werden wenn VisCounter > 1 daran bin ich gescheitert.
try
GetMem(VisInfo[VisCounter], SizeOf(TWinampVisInfo)); ZeroMemory(VisInfo[VisCounter], SizeOf(TWinampVisInfo)); except BassFuncs^.SetError(BASS_ERROR_MEM); Exit; end; EDIT: Zitat:
Der Counter bzw.. das plugin was entladen weden soll wird aus der Hauptanwendung übergeben.
Delphi-Quellcode:
gruß
function BASS_WINAMPVIS_Free(handle: HVIS; VisCounter: Integer): boolean; stdcall;
begin Result := False; VisWinCounter := VisCounter; if (not W_ValidHandle(handle)) then begin BassFuncs^.SetError(BASS_ERROR_HANDLE); Exit; end; VisInfo[VisCounter] := PWinampVisInfo(handle); if (VisInfo[VisCounter]^.Init) then begin PostMessage(VisInfo[VisCounter]^.WinHandle, WM_QUIT, 0, 0); FreeLibrary(VisDllHandle); end else begin W_RemoveHandle(DWORD(VisInfo[VisCounter])); FreeLibrary(VisInfo[VisCounter]^.DllInstance); FreeMem(VisInfo[VisCounter]); end; BassFuncs^.SetError(BASS_OK); Result := True; end; |
Re: Array , Löschen von selben verhindern.
Hallo Emil,
Delphi-Quellcode:
das muss nicht sein. In der Regel weiß Delphi zwischen PChar und String automatisch zu konvertieren.
// Voller Pfad des Plugin
FileName := StrPas(f);
Delphi-Quellcode:
f oder FileName genügt - kein casting nötig.
if not FileExists(PChar(FileName)) then
Delphi-Quellcode:
das ist nicht verständlich - auch weil du so viele globale Variablen benutzt.
if VisCounter = 0 then
VisWinCounter := VisCounter;
Delphi-Quellcode:
Wenn VisInfo als statisches Array deklariert ist (siehe Beitrag #1), dann greift der Code hier bei VisCounter = 0 ins Leere.
try
GetMem(VisInfo[VisCounter], SizeOf(TWinampVisInfo)); ZeroMemory(VisInfo[VisCounter], SizeOf(TWinampVisInfo)); except BassFuncs^.SetError(BASS_ERROR_MEM); Exit; end; Kannst du nicht ein dynamisches Array verwenden?
Delphi-Quellcode:
An die Stelle der globalen Variable VisCounter könnte dann Length(VisInfo) treten. Wenn du ein statisches Array benutzen musst, dann müsstest du aber ähnlich vorgehen.
type
TVisInfo = array of PWinampVisInfo; var VisInfo: TVisInfo; function AddVisInfo(var vi: TVisInfo): TVisInfo; begin index := Length(vi); SetLength(vi, Succ(index)); New(vi[index]); // Freigabe mit Dispose(vi[index]) - Borland empfiehlt es ZeroMemory(vi[index], SizeOf(vi[index]^)); end; procedure DeleteVisInfo(var vi: TVisInfo; p: PWinampVisInfo); var index, iFound: Integer; begin // locate pointer iFound := -1; // not found for index := Low(vi) to Length(vi) do if (index < Length(vi)) and (vi[index] = p) then begin iFound := index; Break; end; if iFound <> -1 then // fill the gap begin Dispose(vi[index]); if index <> High(vi) then vi[index] := vi[High(vi)]; SetLength(vi, High(vi)); end; end;
Delphi-Quellcode:
Jetzt muss ich erstmal eine Pause machen - deine Probleme sind immer so umfangreich...
// ...
// SetCurrentDirectory(PChar(FileName)); // vielleicht besser so: SetCurrentDirectory(ExtractFilePath(f)); Freundliche Grüße |
Re: Array , Löschen von selben verhindern.
Zitat:
VisCounter = 0 ist reserviert für Plugins welche nicht initialisiert(gestartet) wurden. VisWinCounter ist der zähler welcher übergreifend im ganzen Code zur identifizierung des in der PluginListe angeklickten Plugin gilt. Wurde das Plugin nicht gestartet dann ist VisWinCounter immer null. Muss also wie oben den wert 0 bekommen. Dadurch kann ich die configuration der Plugins starten editieren welche selbst nicht initialisiert(gestartet) wurden.
Code:
Hier wird aus der Hauptanwendung tmpvis ermittelt.
tmpvis = BASS_WINAMPVIS_CreateVis(alist(IntI), module, BASS_VIS_NOINIT, 0, False, "0")
BASS_VIS_NOINIT bedeutet das das Plugin nicht gestartet wird deshalb wird VisCounter mit 0 übergeben. Nun kann ich alle namen der module und des Plugins selbst ermitteln ohne das ein Plugin gestartet wurde. VisCounter = 0 geht also nie ins leere .. Wenn 0 dann kann ich mit allen Plugins arbeiten .. config usw.. ohne das die gestarteten Plugins davon betroffen oder beeinflusst werden. VisWinCounter wird zweimal übergeben einmal 0 wenn kein Plugin gestartet wird und hier
Delphi-Quellcode:
wenn eins gestartet wurde. erst dann wird es hochgezählt.
if (VisInfo[VisCounter]^.Init) then
begin VisWinCounter := VisCounter; VisInfo[VisWinCounter]^.VisInfoCount := VisWinCounter; Zitat:
Bin halt übervorsichtig :) Also beim ersten start 1 Plugin läuft gibt es keinen AV keine anderen Fehler! Beim zweiten Plugin muss ich nur dafür sorgen das der erste eintrag Array(1) nicht von Array(2) überschrieben wird. Andere probs habe ich nicht. gruß |
Re: Array , Löschen von selben verhindern.
Niemand eine Ahnung?
Es muss doch möglich sein ähnlich wie dieser Code (funktioniert nicht ganz)
Delphi-Quellcode:
im Array(2) die Daten vom 2 plugin zu integrieren.
if VisCounter = 0 then
begin VisWinCounter := VisCounter; try GetMem(VisInfo[VisCounter], SizeOf(TWinampVisInfo)); ZeroMemory(VisInfo[VisCounter], SizeOf(TWinampVisInfo)); except BassFuncs^.SetError(BASS_ERROR_MEM); Exit; end; end else begin ReAllocMem(VisInfo[VisCounter], VisCounter * SizeOf(TWinampVisInfo)); end; ohne das Array(1) Daten vom 1 Plugin überschrieben oder gelöscht werden. gruß |
Re: Array , Löschen von selben verhindern.
Das Array ist ein Array of Pxxxxx, Und Du initialisierst jedes Element, in dem Du SizeOf(Txxxxx) Bytes überschreibst.....
Jedes Element des Arrays enthält doch aber nur SizeOF (Pxxxxx) Bytes, oder? |
Re: Array , Löschen von selben verhindern.
Zitat:
zum ersten ja! Nochmal die Type welche als Array ausgelegt ist.
Delphi-Quellcode:
so wie in meinen letzten Beispiel müßte es eigentlich gehen was noch fehlt wäre
Type
PWinampVisInfo = ^TWinampVisInfo; TWinampVisInfo = Packed record Title: PChar; FileName: PChar; PlaylistLength: integer; PlaylistPos: integer; Pos, Len: QWORD; VisHeader: PWinampVisHeader; VisModule: PWinampVisModule; Init, Init2, Rendering: boolean; DllInstance: THandle; WinHandle: THandle; PluginId: DWORD; ParentHandle: DWORD; Vis_Atom_Emu: ATOM; Vis_Window_Emu: HWND; VisInfoCount: Integer; end; Var VisInfo: array [1..5] of PWinampVisInfo; Das Array(1) zu kopieren wenn ein neues Plugin gestartet wird Das Array(2) mit den Daten vom Plugin 2 zu füllen und die kopierten Daten von Array(1) zurück zuschreiben wenn dieses überschrieben wird.(das wird es ja... mein Problem!) Weiss sonst nicht wie ich das erklären soll. gruß |
Re: Array , Löschen von selben verhindern.
Zitat:
Edit: Also wenn's echt nur ums kopieren geht: CopyMemory EDit²: Die fehlenden roten Kasten können einem ganz schön durcheinander bringen :roteyes: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 16:46 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