Wo CoInitializeEx und CoUninitialize unterbringen?
-
Hallo Forum,
wo bringe ich die Aufrufe CoInitializeEx und CoUninitialize innerhalb eines VS.Net ATL Projektes unter? Ein DllMain() scheint es gar nicht zu geben? Auszug aus Win32Sdk.hlp:
Typically, CoInitializeEx is called only once by each thread in the process that uses the OLE library
CoInitializeEx(0, COINIT_MULTITHREADED); ... CoUninitialize();
Vielen Dank
Bommel
-
Ein ALT-COM Projekt hat diese Aufrufe i.d.R. schon automatisch drin... oder was für ein projekt hast Du denn?
PS: VS.NET war leider ein falscher und nichtssagender Name... Du meinst wohl VS2003, oder?
-
Es ist ein VS 2003 C++ Atl Projekt.
Projekt, Klassen und Interfaces wurden immer per Assistent erstellt. Wenn ich das Projektverzeichnis nach "CoInitialize" durchsuchen lasse finde ich nur die Projektname.pch Datei. Fügt der Kompiler die Init Aufrufe hinzu?Nehmen wir an ich möchte beim Laden der DLL etwas initialisieren. Wo würde ich das dann machen? Es gibt eine Klasse:
class C_MeinProjektName_Module { public: };
Wäre das der richtige Platz?
-
Die Aufrufe von CoInitializeEx() und CoUninitialize() erfolgen durch den Anwender
der COM-Objekte also dem COM-Client. Du entwickelst jedoch einen COM-Server wenn
ich das richtig verstanden habe.
Da du möglicherweise selbst wiederum andere COM-Server verwendest erfolgt der
CoInitializeEx()-call für deinen COM-Server im Konstruktor für deine globale
_module-variable.
-
Der Com Client ist bei mir zu 99% Excel VBA. Das heißt Excel macht das automatisch, ohne das ich den "unerfahrenen" Anwendern einen privaten Lehrgang geben muß?
-
Wenn dein COM-Server in eine Excel-Anwendung eingebunden wird, dann kannst du
zu 99,9..........% sicher sein das du deinen Anwendern nicht den Gebrauch von
CoInitializeEx() und CoUninitialize() erklären musst.
-
Ok, vielen Dank
-
Wenn Du ein COM Objekt baust, dann musst Du damit leben, wie der User CoInitialize aufgerufen hat! Dein Objekt wird durch COM erzeugt in dem Apartment das eben festgelegt wurde.
-
Nehmen wir an ich möchte beim Laden der DLL etwas initialisieren. Wo würde ich das dann machen?
Schlecht ist auf jeden Fall in DllMain oder in Konstruktoren statisch/global instanzierter Objekte. Die laufen nämlich während des Ladens der DLL (LoadLibrary), und einige Dinge funktionieren da nicht so wie man es erwartet.
Ich würde vermutlich im ctor aller COM Objekte die in der DLL implementiert sind die globale Initialisierung durchführen falls es nicht schon geschehen ist. Natürlich sollte man dann darauf achten dass das threadsafe passiert.
-
Die DllMain war mitten in einem Sourceblock der Datei <ProjektName>.cpp versteckt. Deshalb habe ich sie nicht sofort gefunden. Ich wollte OpenSSL initialisieren... ich werde es erstmal in DllMain ausprobieren, ansonsten muß ich halt in allen Encryption Funktionen abfragen ob Init schon aufgerufen wurde...
Vielen Dank
Bommel
-
Lass es bleiben komplexe Initialisierung und Referenzen auf andere DLLs in DllMain einzubauen. Das geht nur zu oft schief!
-
Bommel schrieb:
...ansonsten muß ich halt in allen Encryption Funktionen abfragen ob Init schon aufgerufen wurde...
Äh.
COM DLL -> COM Objekte?
Wo gibts (freie) da Funktionen? Es müsste also reichen beim Anlegen eines COM Objektes zu überprüfen ob die OpenSSL schon initialisiert wurde.Das dürfte von der Laufzeit her dann auch keinen merkbaren Unterschied geben.
-
hustbaer schrieb:
Es müsste also reichen beim Anlegen eines COM Objektes zu überprüfen ob die OpenSSL schon initialisiert wurde.
Das dürfte von der Laufzeit her dann auch keinen merkbaren Unterschied geben.
Das meinte ich ja. Die Laufzeit ist egal. Ich muß nur in jeder Funktion eine Abfrage machen...
-
Ich verstehe immer noch nicht was du mit "jede Funktion" meinst.
Du wirst wohl ein paar mehr Funktionen haben ausser den Konstruktoren/Init-Funktionen der COM Objekte.
Von daher ist das lange nicht "jede Funktion".
-
hustbaer schrieb:
Bommel schrieb:
...ansonsten muß ich halt in allen Encryption Funktionen abfragen ob Init schon aufgerufen wurde...
Äh.
COM DLL -> COM Objekte?
Wo gibts (freie) da Funktionen? Es müsste also reichen beim Anlegen eines COM Objektes zu überprüfen ob die OpenSSL schon initialisiert wurde.Das dürfte von der Laufzeit her dann auch keinen merkbaren Unterschied geben.
Das langt doch wenn Du es bei der Erzeugung Deiens Objektes machst?
Ich verstehe Dein problem nicht. Ein COM Objekt ist ein Objekt mit Laufzeit und hat einen Zustand...
-
Ich meine ja er soll IN der COM DLL welche die OpenSSL verwendet, beim Erzeugen derjenigen Objekte die die OpenSSL verwenden, die OpenSSL initialisieren. Also im ctor der COM Objekte eben.
Er hat halt immer wieder geschrieben "in jeder Funktion" - und ich wollte ihm damit sagen dass das nicht nötig ist.