Probleme mit ADO (CoCreateInstance) unter Windows Vista
-
Hallo,
ich verwende in einem Projekt ADO zum Zugriff auf verschiedene Datenbanken. Die Funktionen, um die es hier geht, stelle ich in einer dll zur Verfügung.
Funktioniert mit Windows 2000 und XP wunderbar, unter Vista hängt sich meine Applikation auf.
Also habe ich mir ein Testprojekt mit VC8 erstellt, das nichts anderes macht, als die COM-Schnittstelle zu aktivieren und einen Pointer auf das benötigte COM-objekt zu beschaffen. Das funktioniert auch unter Vista, wenn ich das in einem .exe-Projekt mache; sobald ich das ganze in einer dll versuche, hängt die Applikation.
Das Problem liegt im Konstruktor der CADODatabase-Klasse, die ich von codeproject.com habe und tritt beim Aufruf von CreateInstance bzw.
CoCreateInstance auf:CADODatabase() { ::CoInitialize(NULL); HRESULT hRres; // Member _ConnectionPtr m_pConnection; aus msado15.tlh m_pConnection = NULL; //Ursprünglicher Zustand mit CreateInstance //m_pConnection.CreateInstance(__uuidof(Connection)); //neuer Versuch mit CoCreateInstance hRres = ::CoCreateInstance(__uuidof(Connection), NULL, CLSCTX_ALL,__uuidof(IUnknown), (void**)&m_pConnection); // die Applikation hängt sich beim Aufruf jeder der beiden Create-Funktionen auf }
Wie gesagt, unter Windows 2000 und XP funktionieren beide Varianten, mit CreateInstance und mit CoCreateInstance problemlos.
Unter Windows Vista hängt die Application bei eben diesen Funktionen. Ich kann also auch den Rückgabewert nicht prüfen, da die Funktion nie zurück kommt.
Das Problem tritt auch nur auf, wenn der Konstruktor in einer dll aufgerufen wird, von einer exe aus habe ich dieses Problem nicht.Ich habe versucht, das Projekt auf Vista unter Verwendung der dort installierten msado15.dll zu kompilieren, ohne dass sich irgend etwas am Verhalten ändert.
Hat vielleicht jemand eine Idee, was ich falsch mache? Muss ich beim Initialisieren der COM-Schnittstelle in einer dll etwas beachten, was bei einer exe nicht notwendig ist (vielleicht funktioniert meine Applikation unter XP bisher nur zufällig)?
Wenn sich jemand das Testprojekt ansehen möchte, kann ich es ihm gerne zusenden.
Vielen Dank & Viele Grüße
Peter
-
Verstehe ich das richtig?
Du hast eine DLL und dieser Konstruktor wird während des Ladens der DLL aufgerufen?Dann hast Du Glück, dass es überhaupt funktioniert hat, denn CoCreateInstance ist eine verbotene Funktion während DllMan abläuft. Gleiches gilt wenn dieser Konstruktor für eine statische Variable ausgeführt wird.
Auch unter W2K oder XP garantiert Dir niemand das CoCreateInstance erfolgreich in DllMain ausgeführt werden kann. Im allgemeinen muss dies fehlschlagen.
-
Hallo Martin,
Danke für Deine Antwort. Der Konstruktor wird in der InitInstance-Funktion der .dll aufgerufen (es wird eine Instanz dieser Klasse mittels new erzeugt).
Dann sollte ich die Erzeugung dieser Instanz also auf einen späteren Zeitpunkt verschieben, wenn die dll vollständig initialisiert ist?Viele Grüße
Peter
-
Hallo,
ja, das war das Problem. Wenn ich die Instanz später erzeuge, funktioniert das Ganze.
Vielen Dank
Peter
-
Auch unter W2K oder XP garantiert Dir niemand das CoCreateInstance erfolgreich in DllMain ausgeführt werden kann. Im allgemeinen muss dies fehlschlagen.
Hihi, ja. Leider isses unter Windows 95 noch (zumindest teilweise) gegangen.
Hier hätte sich MS ruhig etwas mehr Arbeit antun können und zumindest für die schlimmsten Sünden einfach Warnungen über DebugOut() raushauen