Problem mit dem Bilden einer Instanze einer ActiveX zur Laufzeit und mit dem anschliessenden Aufrufen einer Methode dies



  • Hallo!

    Ich möchte eine Instanze einer ActiveX zur Laufzeit bilden und dann eine der Methoden dieser Componente aufrufen.
    Ich bin soweit, dass ich bereits eine Instanze bilde ( mit cocreateinstance(...) und createcontrol(..)). Dann hole ich mir mit GetIDsOfNames(...)
    die dispid der gewünschten Methode(CONFIG()). Das klappt eigentlich alles ganz gut, nur wenn ich dann die Methode zu zugehörigen dispid aufrufen möchte,
    bekomm ich ein HRESULT = E_UNEXPECTED.
    Was mach ich falsch, Danke schon einmal im Voraus.

    ......
    
    static CLSID clsid;	// i already get the right clsid from the registry
    
    IDispatch *pInterface = 0;
    
    CoInitialize(NULL);
    
    // create the control 
    HRESULT hRet = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, IID_IDispatch, (void**) &pInterface ); 
    // examine return value 
    if(hRet!=S_OK) pInterface = 0;  
    
    CString CstrMethod = "CONFIG"; 
    BSTR BstrMethod = CstrMethod.AllocSysString();
    
    DISPID dispid; 
    
    // get the id of the method									
    hRet = pInterface->GetIDsOfNames(IID_NULL, &BstrMethod, CLSCTX_INPROC_SERVER , LOCALE_SYSTEM_DEFAULT, &dispid); 
    
    if(hRet!=S_OK) MessageBox("It is not possible to get the Id of the method!");
    
    CWnd m_ControlWrapper;
    RECT rct = {0,0,5,50};
    
    BOOL bStat=FALSE;
    bStat= m_ControlWrapper.CreateControl(clsid, "Spectrometer", WS_CHILD, rct, this, 1212, NULL, FALSE, NULL);
    
    if (bStat == FALSE)
    {
         MessageBox ("Could not place control");
         return;
    }
    
    VARIANT varResult;
    VariantInit(&varResult);
    EXCEPINFO ExceptInfo;
    DISPPARAMS dispparamsNoArgs = { NULL, NULL, 0, 0 };
    
    // here is the problem hRet = E_UNEXPECTED
    hRet = pInterface->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, &dispparamsNoArgs, &varResult, &ExceptInfo, NULL);
    
    CoUninitialize();
    


  • Der 3. parameter von GetIDsOfNames ist die Anzahl der Namen, das ist 1 in deinem Fall, nicht CLSCTX_INPROC_SERVER.

    EDIT: CLSCTX_INPROC_SERVER ist 1, also ist das nicht die Ursache. Trotzdem solltest du hier nicht diese Konstante verwenden.

    EDIT2: Bist du sicher, dass CONFIG keine Parameter braucht? Klingt irgendwie etwas seltsam...

    EDIT3: Welche Sprache soll's denn nun sein?



  • Hallo!

    CLSCTX_INPROC_SERVER ist aber als 1 definiert

    CLSCTX_INPROC_SERVER is defined as 1

    and

    CONFIG() braucht keine Parameter , 100% sicher

    CONFIG() need no Parameter ,i am sure to 100%

    Thanks



  • Ausserdem bekomme ich ja die richtige DISPID, ich weiss das, da mir die IDL der Componente vorliegt.

    I know the right dispid from CONFIG() and it is the right DISPID which i get

    Thanks



  • masanne schrieb:

    CLSCTX_INPROC_SERVER ist aber als 1 definiert

    Mag ja sein. NUMBER_OF_GODS_IN_CHRISTIANITY ist sicher auch als 1 definiert, trotzdem würde ich es hier nicht einsetzen, weil es den Sinn nicht trifft.

    Steht nach dem Aufruf etwas in varResult oder ExceptInfo?

    Könntest du dich mal auf eine Sprache festlegen?



  • Sprache: Dann deutsch bitte, ich habe nur den Text auch auf einer engl. Seite gepostet und erst nur kopiert.

    sorry



  • varresult = {VT_EMPTY} --> also nichts
    CONFIG() hat aber eigentlich auch keinen Rückgabewert , es soll sich nur eine Dialog Box öffnen

    ExceptInfo = {wCode=52428 wReserved=52428 bstrSource=0xcccccccc <Bad Ptr> ...}
    das sagt mir aber nichts, ich denke das es leer ist, da vor dem Aufruf von invoke die gleichen Informationen für ExceptInfo da stehen ( im Debug-Modus)

    masanne



  • Keine Plan mehr, was noch falsch sein könnte?



  • Ich vermute, du erzeugst zwei Objekte, und rufst Invoke mit dem falschen auf. Vielleicht kann jemand dazu etwas sagen, der sich besser mit der Verwendung von ActiveX-Controls ohne Wrapper auskennt.



  • wie kommst du darauf, dass ich zwei Instanzen erzeuge? wegen cocreateinstance und createcontrol?

    Trotzdem schonmal Danke das du dir Zeit genommen hast

    masanne



  • masanne schrieb:

    wie kommst du darauf, dass ich zwei Instanzen erzeuge? wegen cocreateinstance und createcontrol?

    Genau. Ich vermute, letzteres erzeugt auch eine Instanz des Steuerelements. Und vermutlich kann nur die richig auf CONFIG reagieren.



  • MFK schrieb:

    masanne schrieb:

    wie kommst du darauf, dass ich zwei Instanzen erzeuge? wegen cocreateinstance und createcontrol?

    Genau. Ich vermute, letzteres erzeugt auch eine Instanz des Steuerelements. Und vermutlich kann nur die richig auf CONFIG reagieren.

    Das war der entscheidende Satz. Danke Schön.

    ...
    CoInitialize(NULL);
    
    CWnd m_ControlWrapper;
    RECT rct = {0,0,5,50};
    
    BOOL bStat=FALSE;
    bStat= m_ControlWrapper.CreateControl(clsid, "Spectrometer", WS_CHILD, rct, this, 1212, NULL, FALSE, NULL);
    
    if (bStat == FALSE)
    {
    	MessageBox ("Could not place control");
    	return;
    }
    
    // Use the IUnknown of the control.
    LPUNKNOWN pUnk = m_ControlWrapper.GetControlUnknown();
    
    // From there get the IDispatch interface of control.
    LPDISPATCH pInterface = NULL;
    pUnk->QueryInterface(IID_IDispatch, (LPVOID*)&pInterface);
    
    CString CstrMethod = "CONFIG"; // andere Methode z.B. "SCAN"
    BSTR BstrMethod = CstrMethod.AllocSysString();
    
    DISPID dispid; 
    
    // get the id of the method									
    HRESULT hRet = pInterface->GetIDsOfNames(IID_NULL, &BstrMethod, CLSCTX_INPROC_SERVER , LOCALE_SYSTEM_DEFAULT, &dispid); 
    
    m_ControlWrapper.InvokeHelper(dispid, DISPATCH_METHOD, VT_EMPTY, NULL, NULL);//InvokeHelper(0xc, DISPATCH_METHOD , VT_EMPTY, NULL, NULL);
    
    CoUninitialize(); 
    ...
    

    Nur, dass ich das CONFIG-Window nicht angezeigt bekomm. Aber wenn ich es mit einer anderen Methode versuche, klappt es.


Anmelden zum Antworten