ActiveX-DLL Exception
-
Hallo Freunde der Nacht und Extragrüße an den guten alten Mr. B.,
ich habe eine ActiveX-DLL (Project raw, Klasse craw, Funktion getClientLicenses() as long) in VB6 erstellt und rufe diese in VC6 so auf:
CLSID clsid; CoInitialize(NULL); HRESULT hResult = CLSIDFromProgID(OLESTR("raw.craw"), &clsid); _craw *t; hResult = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, __uuidof(_craw), (LPVOID *) &t); if(hResult != S_OK) return INVALID_LICENSE_KEY; long iRes = (long)t->getClientLicenses(); t->Release(); CoUninitialize(); return iRes;Das läuft ohne Probleme. Aber in der IDE unter Debugbedingungen greift der Compiler per First Chance Exception zu und meckert über eine nicht abgefangene Exception durch ein invalides Handle in der Zeile hResult = CoCreateInstance(...).
Wie kriege ich diese blöde Meldung weg?
Beste Grüße
Euren Wruckinator
-
Ich weiß nicht, warum du es so kompliziert machst.
Ich hätte es so gemacht:#import "raw.dll" rename_namespace("RawLib") RawLib::IDeinInterfaceNamePtr m_InterfaceName; HRESULT res = m_InterfaceName.CreateInstance(__uuidof(RawLib::DeinInterfaceNamePtr)); if (SUCCEEDED(res)) { ; // Erzeugung OK mach irgendwas } else { ; // Erzeugung Nicht OK, mach was anderes } // Wenn OK try { long ret = m_InterfaceName->getClientLicenses(); // Jetzt mach irgendwas mit deinem ret.. } catch(_com_error& rExc) { ; // Mache irgendwelche Behandlng hier.. } // fertigSo würde ich mit einem Active-X oder allgemein mit einem COM Ding umgehen die in C++ geschrieben sind. Ob Du im VB die Interfaces auch so hast weiß ich nicht, müsste aber irgendwie ähnlic gehen. Ist zumindest viel einfacher als deine lösung. Kannst Ja "RawLib::" eintippen, dann siehst du ja, was für Interfaces du hast.
-
Hallo lazydot! Deine Methode ist sehr logisch und scheint wirklich die einfachste zu sein. Aber leider: Ich bekomme durch den Aufruf zwar eine uuid zurück, aber die Erstellung einer Instanz der Klasse schlägt auf diesem Wege fehl. Ich bleibe aber dran und melde mich wieder...
Danke für die ausführliche Antwort!
Wruckinator
-
El Wruckinatore schrieb:
..Aber leider: Ich bekomme durch den Aufruf zwar eine uuid zurück, aber die Erstellung einer Instanz der Klasse schlägt auf diesem Wege fehl..
Schuldigung, ich hatte auch einen kleinen Fehler gemacht, mach es ung. so:
#import "raw.dll" rename_namespace("RawLib") // deine dll hier RawLib::IDeinInterfaceNamePtr m_InterfaceName; // hier muss du wissen, welchen // Interface Smart Pointer du haben willst, einfach RawLib::<Strg>+<Space> // eintippen, dann siehst du was du brauchst HRESULT res = m_InterfaceName.CreateInstance(__uuidof(RawLib::DeinInterfaceNamePtr)); // hier war der Fehler, Wenn du RawLib::IDeinInterfaceNamePtr m_InterfaceName // gemachst hast, dann muss du hier __uuidof(RawLib::DeinInterfaceName) // machen (ohne "I" davor und ohne "Ptr" danach)Hilft dir das weiter? Du kannst auch in den Projekt Settings Kategorie "Debug", "Zusätzliche Dll's" wählen und dann den Pfad zu deiner Dll eingeben, dann ist ein möglicher Fehler weniger.
Kannst du deine VB Dll über VC++ Projekt aus debuggen? Mach das mal, könnte interessant sein. Ich kann aus einem VC++ Projekt ein anderes VC++ Projekt debuggen, ob es mit VB geht, muss du ausprobieren.