2012-04-05 6 views
2

Ich habe eine Anwendung, wo ich einen Thread erstellt habe, die die Datenbank für einen bestimmten Typ von Daten für ein Timeout-Intervall überprüfen muss. Der Thread ist voll verantwortlich für das Erstellen der Datenbankverbindung, das Abfragen und das Schließen der Verbindung. Ich mache den CoInitialize-Aufruf nur einmal in der Thread-Ausführung und ich habe die Ado-Verbindung und Ado Query für die anschließende Verwendung wiederverwendet.kann mehrere Anrufe Councilitialize Absturz einer Anwendung?

Jetzt ist meine Frage, hatte ich zuvor (vielleicht irrtümlich) eine CoUnitialize-Anweisung in der Schleife für die Überprüfung der Datenbankdaten. was bedeutet, dass der Aufruf von CoUnitialize jedes Mal ausgeführt wurde. Warum ist die Anwendung nicht abgestürzt? Da keine Daten zur Freigabe von CoUnitialize vorhanden waren, sollte dies fehlgeschlagen sein. Ich bezweifle das.

Vielen Dank im Voraus

+0

Ziemlich schwer zu verstehen, wie sich eine API verhalten soll, wenn Sie sie missbrauchen. Da "CoUninitialize" über keinen Mechanismus zum Melden von Fehlern verfügt, kann es nicht tatsächlich fehlschlagen. Warum ist deine App nicht abgestürzt? Vielleicht ist "CoUninitialize" robust gegenüber diesem Missbrauch. Egal was, repariere deine App und mach weiter. –

+0

Ich hatte die gleiche Frage, ich eine meiner Apps, wenn ich einen zweiten Anruf bei CoInitialize die App eingefroren habe. –

+0

tat ich eigentlich. Jetzt habe ich einen counitialize Anruf nur wenn mein Thread beendet wird. Dies wird nur ein (Coinit - CoUninit) Paar – CyprUS

Antwort

4

CoUninitialize ist eine WinApi Funktion, die nichts und gibt nichts zurück nimmt. Da diese WINAPI-Funktionen niemals eine Ausnahme (AFAIK) auslösen, stürzt Ihre Anwendung nicht ab, indem sie sie aufruft. CoUnitialize wird nur stillschweigend fehlschlagen, wenn es zu oft aufgerufen wird.

Ihre Anwendung kann jedoch anschließend abstürzen, wenn Code aufgerufen wird, der eine initialisierte COM benötigt. Dass Ihre Anwendung nicht abstürzt, kann zwei Dinge bedeuten: Der Code braucht CoInitialize nicht, oder irgendwo anders wird CoInitialize aufgerufen, vielleicht in Ihrer ADO-Bibliothek.

Verwandte Themen