Autor Beitrag
bk_moon
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Fr 15.06.07 22:02 
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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 378

Win XP/Vista, Debian, (K)Ubuntu
Delphi 5 Prof, Delphi 7 Prof, C# (#Develop, VS 2005), Java (Eclipse), C++, QT, PHP, Python
BeitragVerfasst: 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 Threadstarter
Hält's aus hier
Beiträge: 2



BeitragVerfasst: Fr 22.06.07 17:58 
Ich hab die Lösung mittlerweile gefunden. Man muss ComInitialize im ServerController aufrufen. Dann klappt alles wunderbar!
alzaimar
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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... ;-)

_________________
Na denn, dann. Bis dann, denn.
xck3001
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 32


D5 Pers, D7 Ent
BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2889
Erhaltene Danke: 13

W2000, XP
D6E, BDS2006A, DevExpress
BeitragVerfasst: 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.

_________________
Na denn, dann. Bis dann, denn.


Zuletzt bearbeitet von alzaimar am Mo 29.10.07 09:15, insgesamt 1-mal bearbeitet
xck3001
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 32


D5 Pers, D7 Ent
BeitragVerfasst: So 28.10.07 15:48 
Stimmt, Denkfehler meinerseits.
Danke für die Aufklärung!