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