![]() |
Virtual-Deklaration führt zu "CPU-Debugger-Fehlern"
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo zusammen!
Das nun folgende Problem ergab sich bei der Einbindung der TAudioIO-Komponente (ist vielleicht einigen bekannt), die einfache Soundverarbeitung ermöglicht. Führt man ein Programm aus, in der diese verwendet wird, kommt es nach dem Beenden zu „CPU-Fehlern“, es öffnet sich also der Delphi CPU-Debugger. Auch wenn der Fehler im „normalen Betrieb“ ohne Debugger so gut wie nie auftritt (selten kommt: „Der Vorgang written (…) konnte nicht (…) ausgeführt werden) ist dies doch störend, zumal irgendetwas falsch sein muss und ich hasse „unsaubere“ Programme. Also habe ich mich auf die Suche gemacht und nach einigen Stunden (!) den Fehler eingrenzen können. Es lag daran, dass eine Funktion als virtual deklariert war. Das Problem tritt erst auf, wenn Bezug auf die Komponente im implementation-Bereich genommen wird, die reine Einbindung der Datei uses oder die Deklaration einer Variable führt nicht zu dem Fehler. Allerdings reicht es aus, wenn z.B. TMeineKomponente.Create(self); im Quelltext steht, jedoch nie ausgeführt wird. Entfernt man das virtual ist das Problem behoben. Abgesehen davon, dass die Funktion vermutlich überhaupt nicht als virtual benötigt wird, da niemals abgeleitet, frage ich mich dennoch, wie und warum es zu diesem Fehler kommt. Trotz einiger Nachforschungen und „intensivem Nachdenken“ kann ich mir das Problem nicht erklären. Aus diesem Grund habe ich ein sehr kleines Demo-Projekt angefertigt, welches hier angehängt ist. Ich würde mich freuen, wenn sich der ein oder andere Tüftler oder „Wissende“ sich des Problems annehmen und mich aufklären könnte. Zusätzlich poste ich an dieser Stelle noch einmal den gekürzten Quelltext, für diejenigen, die sich das Projekt nicht herunterladen wollen oder den Fehler sofort erkennen:
Delphi-Quellcode:
unit MainUnit;
interface uses (...), MeineKomponente; type TMainForm = class(TForm) Button1: TButton; procedure Button1Click(Sender: TObject); private { Private-Deklarationen } public { Public-Deklarationen } end; var MainForm: TMainForm; implementation {$R *.dfm} procedure TMainForm.Button1Click(Sender: TObject); begin // muss nicht einmal ausgeführt werden, es kommt trotzdem zum Fehler, // solange dies hier steht TMeineKomponente.Create(self); end; end. Und TMeineKomponente:
Delphi-Quellcode:
unit MeineKomponente;
interface uses SysUtils, Classes, ExtCtrls, MMSystem; type TMeineKomponente = class(TComponent) private { Private-Deklarationen } function MySetup : Boolean; virtual; (...) published { Published-Deklarationen } constructor Create(AOwner : TComponent); override; destructor Destroy; override; end; implementation (...) function TMeineKomponente.MySetup : Boolean; var ErrorMsgC: array [0..255] of Char; begin waveInGetErrorText(0,ErrorMsgC,Sizeof(ErrorMsgC)); StrPas(ErrorMsgC); end; end. Vielen Dank schon mal! Grüsse ...Doc |
Re: Virtual-Deklaration führt zu "CPU-Debugger-Fehlern&
Du solltest auf jedenfall die erzeugte Instanz ine eine Instantvariable speichern:
Delphi-Quellcode:
MeineKomp := TMeineKomponente.Create(self);
|
Re: Virtual-Deklaration führt zu "CPU-Debugger-Fehlern&
Das ist mir klar, habe das nur so eingebaut, um zu verdeutlichen, dass es bereits so zu einem Fehler kommt...
Man kann übrigens in Button1Click auch nur TMeineKomponente.ClassName abfragen/eintragen und es kommt zu dem gleichen Fehler. Auch ohne dass Button1Click jemals ausgeführt wird... |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:22 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