Wie kann ich feststellen, wie viele Ebenen von CoInitialize aufgerufen wurden?

8

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%     
Jerry Dodge 27.01.2013, 01:22
quelle

4 Antworten

6

Du kannst es so machen:

%Vor%

Warnung! Da die obige Funktion COM schließt, kann sie nicht in COM-Anwendungen verwendet werden, nur um die spezielle Frage beim Debuggen zu beantworten.

    
kludg 27.01.2013, 01:48
quelle
10

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.

    
David Heffernan 27.01.2013 12:28
quelle
2

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.

    
pf1957 27.01.2013 07:45
quelle
1

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%     
bummi 27.01.2013 12:26
quelle

Tags und Links