Hey,
ich hatte vor ein paar Tagen ja kleines Projekt von mir hochgeladen, den HTTPManager. Nun bin ich dabei dies in DLLs zu nutzen, wobei der HTTPManager im eigentlichen Hauptprogramm erstellt wird (als Singelton) und die
DLL nur eine Interface-Instanz davon bekommt.
Wenn die
DLL nun die "erste" Singelton Instanz bekommt, dann gibt es am Programmende einen Fehler (sonst nicht, also wenn sie im Hauptthread erstellt wird):
Zitat von
Fehlermeldung:
---------------------------
Benachrichtigung über Debugger-
Exception
---------------------------
Im Projekt Project1.exe ist eine
Exception der Klasse EOSError mit der Meldung 'Systemfehler. Code: 1400.
Ungültiges Fensterhandle' aufgetreten.
---------------------------
Anhalten Fortsetzen Hilfe
---------------------------
Zitat von
Aufruf-Stack:
OtlTaskControl.TOmniTask.InternalExecute(???)
OtlTaskControl.TOmniTask.Execute
OtlThreadPool.TOTPWorkerThread.ExecuteWorkItem(??? )
OtlThreadPool.TOTPWorkerThread.Execute
Ich könnte mir auch vorstellen, dass es ein Fehler in der OmniThreadLibrary ist, aber mein Multithreating wissen ist noch sehr spärlich, deshalb glaube ich eher ich mache hier irgendwas falsch.
Um den Fehler zu umgehen könnte man natürlich generell einfach folgendes in der Datei für das Singelton Interface machen:
Delphi-Quellcode:
initialization
TApiHTTPManager.GetInstance;
Zuvor hatte ich noch einen Fehler, dass die Informationen für einen Request die in der
DLL erstellt werden (HTTPRequest, HTTPOptions) nicht mehr freigegeben wurden und es zu weiteren Fehler kam. Dies habe ich gelöst, indem ich die Interfaces kopiert habe. Das habe ich alles händisch gemacht und mir dafür Clone Konstruktoren erstellt. Kann man dies nebenbei vielleicht irgendwie vereinfachen?
Generell stellt sich mir auch die Frage ist das alles so sauber umgesetzt, gibt es Stellen die problematisch sind und was könnte man vielleicht leichter anders besser machen?
Ich habe das komplette Demo Programm im Anhang und versucht alle unwichtigen Teile zu entfernen, trotzdem kann es im ersten Moment etwas unübersichtlich aussehen, deshalb noch eine Grafik in der Hoffnung das es das Verständnis vereinfacht.
Ich selber benutze D2010 aber mit 2009 sollte man es auch noch kompilieren können.
Grüße und schonmal vielen Dank im voraus!