Einzelnen Beitrag anzeigen

DocE

Registriert seit: 25. Mär 2004
108 Beiträge
 
#1

Virtual-Deklaration führt zu "CPU-Debugger-Fehlern"

  Alt 17. Sep 2006, 12:18
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
Angehängte Dateien
Dateityp: zip virtualproblem_199.zip (2,0 KB, 3x aufgerufen)
  Mit Zitat antworten Zitat