DataModul Initialisieren
-
Hallo,
ich hätte mal wieder eine Frage. In meinem Projekt brauche ich auch eine Datenbankverbindung. Diese habe ich in eine DLL ausgelagert. In der DLL habe ich dann ein DataModul eingesetzt und darauf ein ADOConnect für die Verbindung.
Hier im Forum habe ich dann gelesen das man vor der Verwendung dann das DataModul initialisieren muß. Dazu habe ich mir eine Funktion 'ConnectDB' erstellt und exportiert. Um die ADOs verwenden zu können müssen auch die ComObjects initialisiert werden. Auch kein Problem. Zum Trennen der Verbindung gibt es auch eine exportierte Funktion.
int ConnectDB(void) { CoInitializeEx(NULL, COINIT_MULTITHREADED); dmTPOlocal = new TdmTPOlocal(NULL); const String LDBname = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=TPOlcldb.mdb"; dmTPOlocal->ADOConnection->ConnectionString = LDBname; dmTPOlocal->ADOConnection->LoginPrompt = false; try { dmTPOlocal->ADOConnection->Connected = true; } catch (EOleException &e) { delete dmTPOlocal; dmTPOlocal = NULL; return 0; } return 1; } int DisConnectDB(void) { dmTPOlocal->ADOConnection->Connected = false; dmTPOlocal->ADOConnection->ConnectionString = ""; delete dmTPOlocal; dmTPOlocal = NULL; return 1; }
Soweit denke ich ist alles OK. Was ich jetzt noch gerne wissen möchte ist, ob der zweite Parameter bei 'CoInitializeEx' so richtig ist, und ob ich diese auch beim Beenden der Verbindung irgenwie löschen muß, und wenn ja wie.
Würde mich über eine kleine Hilfe feuen.
Grüße Netzschleicher
-
Du musst für jeden CoInitialize/ConInitializeEx Aufruf, der S_OK oder S_FALSE zurückliefert, einmal CoUninitialize aufrufen. Daher würde ich das Pärchen CoInitialize/CoUninitialize in die main() / WinMain Methode verschieben. Oder noch besser die Aufrufe per RAII kapseln:
class COMGuard { HRESULT Result_; public: ComGuard( COINIT ThreadingModel ) : Result_( ::CoInitializeEx( NULL, ThreadingModel ) ) { } ~ComGuard() { if( Result_ == S_OK || Result_ == S_FALSE ) ::CoUninitialize(); } HRESULT result() const { return Result_; } private: // Objekt nicht kopierbar ComGuard( const ComGuard& ); ComGuard& operator=( const ComGuard& ); }; int main() { ComGuard Guard( COINIT_MULTITHREADED ); if( Guard.result() != S_OK && Guard.result() != S_FALSE ) { ... } }