ActiveX Object Übergaben



  • Hi zusammen,

    hat jemand von euch schon einmal ein Object über die ActiveX-Schnittstelle übergeben?

    Wäre bei einer Antwort sehr Dankbar.

    Gruß
    Rocketbuehler



  • IMyObject->MyFunction(IMyParamObject* pObject)

    Sorry, ich versteh dein Problem nicht. 😕



  • Hi zusammen,

    danke für die Schnelle Antwort allerdings funktioniert bei meinem Projekt das nicht. Ich bekomme zur Laufzeit eine Fehlermeldung, wegen Speicherzugriffsverletzung. Ich habe auch schon mit einfachen Datentypen (long, ...) ausprobiert dort Funktioniert es. Nur nicht mit einem Object.

    Hat sonst noch jemand Erfahrungen damit?

    Gruß
    Rocketbuehler



  • Ich glaube ich habe die Frage Falsch gestellt, bzw. auch erst jetzt herausgefunden was mein Fehler ist.

    Meine Frage, dann habe ich glaube ich eine Lösung:

    Wie Initialisiere ich ein eignes definiertes Objekt, wenn ich die Daten über eine ActiveX Schnittstelle bekomme.

    Gruß
    Rocketbuehler



  • Bekommst du ein Objekt über die Schnittstelle das du bearbeiten willst, oder
    willst du eine eigenes COM-Object neu erstellen ?



  • Ich bekomme das Objekt über die Com Schnittstelle.

    Eine Idee?



  • Vieleicht würde etwas konkreter Code weiterhelfen, meine Glaskugel arbeitet
    zur Zeit nicht richtig.



  • Also hier nun ein Beispiel:

    MFC erstelle ActiveX erstelle Header:

    // Computergenerierte IDispatch-Wrapperklassen, die mit dem Assistenten zum Hinzufügen von Klassen aus der Typbibliothek erstellt wurden
    
    #import "C:\\ActiveX.exe" no_namespace
    // CActiveX Wrapperklasse
    
    class CActiveX : public COleDispatchDriver
    {
    public:
    	CActiveX(){} // Ruft den COleDispatchDriver-Standardkonstruktor auf
    	CActiveX(LPDISPATCH pDispatch) : COleDispatchDriver(pDispatch) {}
    	CActiveX(const CActiveX& dispatchSrc) : COleDispatchDriver(dispatchSrc) {}
    
    	// Attribute
    public:
    
    	// Vorgänge
    public:
    
    	// _ActiveX Methoden
    public:
    	long GetObject(MyObject *thisObject)
    	{
    		long result;
    		static BYTE parms[] = VTS_UNKNOWN;
    		InvokeHelper(0x30030004, DISPATCH_METHOD, VT_I4, (void*)&result, parms, thisObject);
    		return result;
    	}
    
    	// _ActiveX Eigenschaften
    public:
    
    };
    

    Wie rufe ich nun die GetObject Methode richtig auf?
    Ist es nun verständlicher was ich meine?


  • Mod

    Hast Du denn einen Interface Zeiger? Dann verwende Attach/Detach um über diesen COleDispatchDriver.
    Absonsten musst Du eben das Objekt erstmal erzeugen mit CreateDisptach (o.ä.)



  • Hi,

    danke schon mal für deine Bemühungen.
    Allerdings habe ich das schon probiert und geht leider nicht.
    Mache ich da was Falsch?

    Hier der Quellcode:

    #include "ActiveX.h"
    
    main()
    {
       CoInitialize(NULL);
    
       CActiveX neu;
    
       if(!neu.CreateDispatch(_T("ActiveX.ActiveX")))
          return false;
    
       MyObject test; 
       neu.GetObject(&test); 
    
       CoUninitialze();
    }
    

    So in Zeile 13 Ruft er dann die Funktion "_malloc_dbg" in der Datei "dbgheap.c" und hier bricht er dann das Programm zur Laufzeit ab.
    Idee?

    Gruß
    Rocketbuehler


  • Mod

    Das ist Quark!
    Du hast damit einen Wrapper aber kein ActiveX Objekt erzeugt.
    Ich habe doch geschrieben, dass Du CreateDispatch aufrufen sollst!
    Außerdem was soll dieses new MyObject!

    Wenn dies ein COM Objekt ist, dann musst Du auch dieses Objekt in COM erzeugen und nicht mit new.

    Ich rate Dir Dich erst einmal bzgl. COM klug zu machen!



  • Ok
    das habe ich vergessen mit dem CreateDispatch. Das habe ich ja auch nun nachgetragen. Aber wie das mit MyObject funktionert ist ja nun dir Frage.



  • Kann mir bitte nun ein Erfahrener ActiveX Programmierer weiter helfen?
    In dem Buch das ich gelesen habe stand leider nichts über diese Problematik.


  • Mod

    Was ist denn Dein Problem?

    Du musst ein Objekt erzeugen um es bedienen zu können!
    Das was die MFC Dir liefert ist nur ein netter Wrapper, ber nicht der Code des Objektes. Er kappselt nur den gesamten COM/Automationskram.

    IMHO fehlen Dir einfach die Grundlagen was COM/ActiveX ist. Wie soll man Dir helfen wenn Du nicht mal detailierte Fragen stellst?

    Was für ein ActiveX Objekt ist das? Welche Methode benötigst Du wie? Wo lebt dieses Control? Aus welcher Applikation heruas willst Du was mit dem Control machen?



  • Ich habe schon gemerkt, dass die Überschrift nicht ganz korrekt ist.
    Allerdings habe ich gedacht mit dem Quellcode wird es etwas verständlicher, was ich programmieren will.

    Ich habe eine Exe die in Visual Basic geschrieben ist.
    Diese gibt über die Funktion GetObject(MyObject *thisObject) den Pointer zu thisObject. Wobei MyObject verschiedene Parametern hat.

    Jetzt möchte ich über eine c++ Routine auf thisObject zugreifen und ändern.

    Ist das anderes zu Handeln wie bei einfachen Datentypen?
    z.B. bei einem BSTR muss man es ja zuerst richtig initialisieren damit es Funktioniert. So was habe ich gedacht, dass es auch bei allgemeinen Objekten gilt.


Log in to reply