Entwickler-Ecke

Datenbanken - CoInitialize wurde nicht aufgerufen


bk_moon - Fr 15.06.07 22:02
Titel: CoInitialize wurde nicht aufgerufen
Hallo Leute,

ich hoffe einer von Euch kann mir helfen - ich werd echt noch wahnsinnig!
Ich mach gerade meine ersten Versuche mit Delphi2007 und den IntraWeb Komponenten.
Ich wollte eigentlich eine Datenbank auslesen und als Webseite anzeigen, aber das klappt nicht.
Es kommt immer der gleiche Fehler: 'CoInitialize wurde nicht aufgerufen'.
Ich hab jetzt auch schon überall nachgeschlagen und ausprobiert, aber nichts funktioniert.

Folgender Aufbau:
Ich hab lediglich eine TADOConnection, eine TADOTable, ein TDataSource und ein TIWDBEdit auf mein Formular gezogen,
alles mit meiner Access Datenbank verbunden und gestartet. Dann kam der Fehler!
Dann habe ich CoInitialize(nil) überall ausprobiert - in der Projektdatei, vor dem Application.run, danach,
in der eigentlichen unit, im Form.Create - quasi überall. Und immer der gleiche Fehler.
Ich weiß echt nicht mehr weiter!!!

Ich hoffe einer von Euch hat eine Idee!
Schon mal vielen Dank!


arj - So 17.06.07 09:49

Ich hatte letzte Woche einen ähnlichen Fehler.
Mein Problem war, dass das CoInitialize nicht in jedem Thread aufgerufen wird, den
ich hatte, da das irgendwie thread-abhängig zu sein scheint.

Die Frage ist bei Dir nur, welcher Thread meckert und wie rufst du es da auf... :?


bk_moon - Fr 22.06.07 17:58

Ich hab die Lösung mittlerweile gefunden. Man muss ComInitialize im ServerController aufrufen. Dann klappt alles wunderbar!


alzaimar - Fr 22.06.07 19:05

Zur Erklärung:
1. ADO verwendet COM-Objekte.
2. COM benötigt CoInitialize und CoUninitialize.
3. COM ist threadlokal, d.h. man muss (2) für jeden Thread aufrufen.
4. Die VCL ruft (2) für den Hauptthread automatisch auf
5. Für alle anderen Threads ist man selbst zuständig.

Daraus folgt: Intraweb hat irgendwas mit Threads zu tun... ;-)


xck3001 - So 28.10.07 02:58

Ich bin gerade bei einer anderen Sache über das gleichen Problem (CoInitialize / CoUninitialize) gestolpert.

Das manuelle Aufrufen in TMyThread.Execute hat bei mir dann auch Abhilfe geschaffen, danke für den Tipp.
Trotzdem verstehe ich nicht wieso das nicht ausreicht, im TMyThread.Create das CoInitialize, und dann im TMyThread.Destroy das CoUninitialize aufzurufen. Der Thread bleibt doch die ganze Zeit bestehen?


alzaimar - So 28.10.07 08:30

Das TMyThread.Create wird im Kontext des Hauptthreads aufgerufen. Oder anders ausgedrückt: Der Thread existiert ja in seinem Konstruktor noch gar nicht.


xck3001 - So 28.10.07 15:48

Stimmt, Denkfehler meinerseits.
Danke für die Aufklärung!