Ich mache ein Debugging bei einem unordentlichen Projekt, das ich dort aufgeschnappt habe, wo der vorherige Entwickler nicht wusste, was sie machen, und das Hauptproblem sind fehlgeschlagene Versuche, die Anwendung mit mehreren Threads zu versehen. Ich räume jetzt das Durcheinander auf und versuche herauszufinden, wo alles schief läuft. Eines der Probleme besteht in inkonsistenten Aufrufen von CoInitialize
, um ADO-Komponenten zu verwenden.
Fortsetzung von meiner vorherige Frage , wie kann ich feststellen, wie viele Ebenen von CoInitialize
aufgerufen wurden?
Nehmen Sie zum Beispiel diesen Code in Betracht:
%Vor% Wenn ich dieses Problem lösen müsste, würde ich es angehen, indem ich Aufrufe an CoInitialize
, CoInitializeEx
und CoUninitialize
anwende. Ich würde die Aufrufe an diese Funktionen hängen und eine thread-lokale Variable verwenden, um die Aufrufe zu zählen.
Sie können dies tun, indem Sie Ihrem Projekt die folgende Einheit hinzufügen.
%Vor%Im Gegensatz zu Sergs Ansatz ändert diese Technik nicht die Semantik Ihres Programms.
Wenn ich ein solches Projekt säubern sollte, würde ich einen abstrakten Thread-Vorfahren erstellen, der Execute überschrieben und in drei virtuelle Methoden aufgeteilt wurde, z. BeforeExecuteTask, AfterExecuteTask und Abstract ExecuteTask.
Ich würde COM (un) Initialisierung in Before / After-Methoden verschieben und alle anderen Vorkommen (DRY) löschen. In jedem Nachkommen würde ich Code von der ursprünglichen Execute-Methode verschieben, um ExecuteTask zu überschreiben.
Sofern Coinitialize und CoUninitialize pro Thread gezählt werden müssen und CoUninitialize nicht zum Zählen aufgerufen werden sollte, sofern COM fehlerhaft ist, können Sie den folgenden Code zum Debuggen verwenden.
%Vor%Dies
%Vor%wäre eine Beispielausgabe der folgenden Einheit:
%Vor%