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