Einzelnen Beitrag anzeigen

SvB

Registriert seit: 21. Okt 2004
Ort: Eckenroth
426 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#1

Microsoft Visual C++ Runtime Library - R6025

  Alt 12. Aug 2009, 00:02
Ich habe heute Stunden mit einem Problem gekämpft und möchte Euch zur Info folgendes durchgeben.

Nach einer größerem Programmänderung, die ich in weitern Teilen erst mal aus dem Kopf heraus machen musste, bevor ich das erste mal wieder kompiliert habe, hatte ich dann beim Beenden vom Programm die Fehlermeldung:
Zitat:
Microsoft Visual C++ Runtime Library
Runtime Error!
Programm C:\Entwicklung\prog.exe
R6025
- pure virtual function call
Ich habe dann das Forum durchsucht, nichts gefunden. Google spuckt tonnenweise Ergebnisse raus, die aber auch nichts gebracht haben. Die Aktualisierung der C++ Runtime hat auch nichts gebracht. Microsoft selbst schreibt folgendes: Link

Das hat mich dann dazu veranlasst meine neu erstellten Threads erst mal "abzuschalten" und Schritt für Schritt alles nacheinander wieder zu "aktivieren" um festzustellen, wo das Problem liegt.

Ich habe ungefähr folgenden Code gehabt:
Delphi-Quellcode:
TmyThread = class(TThread)
private
  FDatabase: TADODatabase;
protected
  procedure Execute; override;
public
  constructor Create(CreateSuspended: Boolean);
  destructor Destroy; override;
  property Database: TADODatabase read FDatabase write FDatabase;
end;

constructor TmyThread.Create(CreateSuspended: Boolean);
begin
  inherited Create(CreateSuspended);
end;

destructor TmyThread.Destroy;
begin
  inherited;
end;

procedure TmyThread.Execute;
begin
  CoInitialize(nil); // Für ADO - muss in jedem eigenen Thread selbst gemacht werden. Unit ActiveX einbinden
  try
    while not Terminated do begin
      // mach irgend etwas, berechne
    end;
  finally
    CoUninitialize;
  end;
end;

.
.
.

procedure TfrmMain.FormCreate(Sender: TObject);
begin
  myThread := TmyThread.Create(True);
  myThread.FreeOnTerminate := True;
  myThread.Database := frmMain.ADODatabase;
  myThread.Resume; // Starte Thread und laufe einmal durch
end;
Beim Beenden vom Programm kam dann dieser C++ Runtime Error, der mich schier zur Verzweiflung gebracht hat.
Das Problem ist wohl, dass mein Haupt-Thread (Formular) schon beendet ist, bevor der Thread an sich selbst beendet ist, der Thread aber noch versucht auf frmMain.ADODatabase zu zugreifen, was ein COM-Objekt ist und dadurch diesen Fehler gebracht hat.

Also, wenn Ihr mal ein ähnliches Problem habt, dann könnt Ihr vielleicht in dieser Richtung suchen.

Ich habe meinen Thread jetzt so umgeschrieben, dass ADODatabase im Thread selbst erzeugt und zerstört wird und bis jetzt gab es keine Probleme mehr.

Grüße
Sven
  Mit Zitat antworten Zitat