c header von vb control
-
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.idlund 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 CLSIDvielleicht 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?