Hej!ADO i trådar - kräver det CoInitialize/CoUninitialize?
Har ett litet problem med ADO i en trådad applikation. Det är en enkel liten arbetstråd som skall köra ett par frågor och hämta resultaten, därefter terminera.
Problemet är att jag får motstridiga signaler om huruvida jag skall anropa CoInitialize/CoUninitialize eller inte. Är det någon här som vet hur det ligger till?
Miljön är Delphi 7 (Win32) och jag använder Delphis ADO-wrappers TADOConnection och TADODataSet. Tråden är en TThread-subklass. För den som inte vet så är den gjord sådan att konstruktorn körs i anropande tråd, sedan anropas TThread.Execute (som är virtuell) i den nya tråden. När Execute returnerar är trådens arbete slutfört och trådobjektet frigörs. Destruktorn körs i den aropande tråden. Alltså: TThread.Execute utgör trådens hela "program".
I TThread.Execute gör jag följande:
1. Skapa TADOConnection (wrapper för ADOConnection) och öppna den.
2. Skapa TADODataSet (wrapper för ADOCommand + ADORecordset).
3. Ange SQL-sats och öppna.
4. Hämta datat.
5. Stäng TADODataSet.
6. Upprepa 3-5 en eller ett par gånger med olika SQL.
7. Frigör TADODataSet,
8. Frigör TADOConnection.
Alltså: ADO-objekten används endast i den aktuella tråden, helt oberoende av alla andra trådar.
Det fungerar utmärkt *utan* CoInitialize/CoUninitialize. Hur kan det komma sig? Jag borde ju få ett felmeddelande "CoInitialize has not been called" (800401F0 hex). Eller?
Första misstanken var att Delphi's ADO-wrappers anropar CoInit/Uninit internt/automatiskt. Men det har jag kollat att de *inte* gör. Anropar jag CoInitialize själv så får jag nämligen S_OK tillbaka. Hade den redan anropats automatiskt skulle jag få S_FALSE (eller RPC_E_CHANGED_MODE om jag angav fel trådmodell).
Jag har gjort testet med eget CoInit-anrop både före steg 1, mellan steg 4 och 5, och efter steg 8. Samma resultat: S_OK. Har även testat med båda trådmodellerna (STA & MTA) och det ger också S_OK i båda fallen.
Kan någon förklara hur jag skall göra?
Mvh,
Kjell