c header von vb control



  • ich hab mir mit MIDL nen header eines vb controls erstellt
    wie verwende ich die funktionen im struct?

    hier der code:

    BEGIN_INTERFACE
    
            HRESULT ( STDMETHODCALLTYPE __RPC_FAR *QueryInterface )( 
                _CK_TFILE_IO __RPC_FAR * This,
                /* [in] */ REFIID riid,
                /* [iid_is][out] */ void __RPC_FAR *__RPC_FAR *ppvObject);
    
            ULONG ( STDMETHODCALLTYPE __RPC_FAR *AddRef )( 
                _CK_TFILE_IO __RPC_FAR * This);
    
            ULONG ( STDMETHODCALLTYPE __RPC_FAR *Release )( 
                _CK_TFILE_IO __RPC_FAR * This);
    
            HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfoCount )( 
                _CK_TFILE_IO __RPC_FAR * This,
                /* [out] */ UINT __RPC_FAR *pctinfo);
    
            HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetTypeInfo )( 
                _CK_TFILE_IO __RPC_FAR * This,
                /* [in] */ UINT iTInfo,
                /* [in] */ LCID lcid,
                /* [out] */ ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo);
    
            HRESULT ( STDMETHODCALLTYPE __RPC_FAR *GetIDsOfNames )( 
                _CK_TFILE_IO __RPC_FAR * This,
                /* [in] */ REFIID riid,
                /* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames,
                /* [in] */ UINT cNames,
                /* [in] */ LCID lcid,
                /* [size_is][out] */ DISPID __RPC_FAR *rgDispId);
    
            /* [local] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *Invoke )( 
                _CK_TFILE_IO __RPC_FAR * This,
                /* [in] */ DISPID dispIdMember,
                /* [in] */ REFIID riid,
                /* [in] */ LCID lcid,
                /* [in] */ WORD wFlags,
                /* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams,
                /* [out] */ VARIANT __RPC_FAR *pVarResult,
                /* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo,
                /* [out] */ UINT __RPC_FAR *puArgErr);
    


  • Soweit ich das erkennen kann, sind das nur IUnknown und IDispatch. Damit wirst du nicht weit kommen. Hast du keine Typbibliothek, die du importieren kannst?



  • doch hab ich... aber ich weiss ned wie man tlbs in vc einbaut/verwendet

    die eigentlichen funktionen sehen so aus

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

    quasi

    /* [id] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *OpenForWriting )( 
                zeiger auf ein objekt, das einen zeiger auf eine structinstanz enthält,
                /* [in] */ parameter,
                /* [retval][out] */ rückgabewert;
    

    ein problem is vorallem die initialisierung des controls... ka wie des richtig geht



  • Im Class Wizard:

    Register Automation
    Add Class -> from a type library



  • 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