c header von vb control



  • ok danke erstmal... hat mir sehr geholfen

    ich hab die klasse jetzt eingebunden, ne instanz erstellt und eine funktion aufgerufen
    die vbfunktion gibt eigentlich immer 0 zurück... in vc kommt aber -85... an
    die andern funktionsaufrufe laufen scheinbar auch ins leere



  • Sovok schrieb:

    die vbfunktion gibt eigentlich immer 0 zurück... in vc kommt aber -85...

    Wirklich -85 (dezimal)? Das wäre ein eigenartiger Wert für ein HRESULT. Oder kommt da noch was dahinter? Der genaue Wert könnte hilfreich sein.



  • -858993460
    bei jedem dieser aufrufe: Warning: attempt to call Invoke with NULL m_lpDispatch!

    aber wie setzt ich so ein dispatch ordenlich auf? was is das überhaupt?

    die andere möglichkeit(c header) brauch ich übrigends auch noch...
    hab sowohl eigene module mit typelib als auch fremde die ich aber beide über vc++ ansprechen muss



  • Sovok schrieb:

    -858993460
    bei jedem dieser aufrufe: Warning: attempt to call Invoke with NULL m_lpDispatch!

    aber wie setzt ich so ein dispatch ordenlich auf?

    Normalerweise mit CreateDispatch. Hast du das gemacht?



  • juuuhuu funzt... danke

    nochmal zurück zu

    /* [id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OpenForWriting )(  
                _CK_TFILE_IO __RPC_FAR * This, 
                /* [in] */ BSTR sCompleteFilename, 
                /* [retval][out] */ long __RPC_FAR *__MIDL_0014);
    

    was muss ich hier zuerst erstellen damit der aufruf klappt?
    und was is der erste parameter?



  • wie is eigentlich die reihenfolge beim setup?

    verfügbar:

    //eigene
    typedef struct _FastDicVtbl
    interface _FastDic
    
    //system
    STDMETHODCALLTYPE __RPC_FAR *QueryInterface
    STDMETHODCALLTYPE __RPC_FAR *AddRef
    STDMETHODCALLTYPE __RPC_FAR *Release
    STDMETHODCALLTYPE __RPC_FAR *GetTypeInfoCount 
    STDMETHODCALLTYPE __RPC_FAR *GetTypeInfo
    STDMETHODCALLTYPE __RPC_FAR *GetIDsOfNames
    STDMETHODCALLTYPE __RPC_FAR *Invoke
    
    //IDS
    const IID LIBID_dh_Dictionary = {0x96622ECD,0xB72A,0x49EA,{0x8E,0xDB,0x50,0xC0,0x21,0xAB,0x2C,0x3D}};
    const IID IID__FastDic = {0x08CBE937,0xCEB0,0x4A14,{0xA2,0xF7,0x04,0x7D,0x7E,0x58,0x55,0x2D}};
    const CLSID CLSID_FastDic = {0x30645B3B,0xE815,0x42C6,{0x9A,0xC8,0x9C,0x3F,0x41,0xC5,0xEF,0x91}};
    class DECLSPEC_UUID("30645B3B-E815-42C6-9AC8-9C3F41C5EF91")
    FastDic;
    

    der ansatz geht jedenfalls voll daneben

    _FastDic FD;
    FD.lpVtbl=new _FastDicVtbl;
    void* VPtr=(void*)FD.lpVtbl;
    
    if(S_OK==FD.lpVtbl->QueryInterface(&FD,IID__FastDic,&VPtr))
         return TRUE;
    

    mir is nich ganz klar was der genau für daten haben will



  • Du kannst COM-Objekte nicht als Autovariablen und auch nicht mit new erstellen. Wenn du die OLE-Wrapperklassen benutzt, die dir der Klassenassistent erstellt, dann musst du CreateDispatch verwenden. Benutzt du COM "einfach so", brauchst du CoCreateInstance.



  • ok cocreateinstance gibt jetzt ok zurück

    CoCreateInstance(CLSID_FastDic,NULL,CLSCTX_ALL,IID__FastDic,(void**)&FD);
    

    aber wenn ich jetzt ne methode aufrufe stürzts gleich wieder ab
    fehlt noch was?



  • Was ist FD? Immer noch ein _FastDic-Objekt?

    Der letzte Parameter muss die Adresse eines Zeigers auf den Interfacetyp sein, dessen IID du als vierten Parameter übergibst.



  • dann müsste es doch stimmen oder?

    interface _FastDic
    {
         CONST_VTBL struct _FastDicVtbl __RPC_FAR *lpVtbl;
    };
    


  • Sovok schrieb:

    interface _FastDic
    {
         CONST_VTBL struct _FastDicVtbl __RPC_FAR *lpVtbl;
    };
    

    Wo hast du eigentlich diese eigenartigen Konstrukte her? So was habe ich noch nie gesehen. Hast du die OLE-Wrapper erstellt oder importierst du die tlb direkt in C++?



  • 1. ole/com viewer öffnen
    2. File->View TypeLib->dll/ocx auswähln
    3. speichern unter-> dateiname.idl
    4. Konsole öffnen-> "MIDL /header dateiname-out.h dateiname-in.idl

    und dann erstellt der mir ne .h und ne .c

    kennst du n besseren weg? ich hab in dem fall nix ausser die .dll



  • CoCreateInstance
    Creates a single uninitialized object of the class associated with a specified CLSID

    vielleicht muss ichs einfach noch initialisiern... aber wie?!?



  • edit: die exception tritt übrigends in der dispatch.exe auf.
    brauch ich noch nen dispatcher wenn ichs mit cocreateinstance erstellt hab?


Anmelden zum Antworten