Hi all, I try to reimplement MysterX with new racket-based ffi, but now I have a trouble of calling virtual functions.For be specific, I show a piece of code, a bit of a modified for simplicity: --------------------#lang racket(require ffi/unsafe (only-in mzlib/defmacro define-macro)) (define ole32 (ffi-lib "ole32")) ;;; ************** Syntax helpers ************************(define-macro (define-ole32 name ole32name . args) `(define ,name (get-ffi-obj (quote ,ole32name) ole32 (_fun #:abi 'stdcall ,@args -> (status : _uint) -> (and (equal? status 0) result))))) ;;; *********************** GUIDs ************************(define-ole32 progid->clsid CLSIDFromProgID _string/utf-16 (result : (_bytes o 16))); returns clsid (bytes - 128-bit Class ID) from progid (string) (define IID_IDispatch #"\0\4\2\0\0\0\0\0\300\0\0\0\0\0\0F") ; let it be a constant ;;; ***************** Connect to COM-server *************(define-cpointer-type _com-interface) (define-ole32 co-create-instance CoCreateInstance (clsid : _bytes) (_pointer = #f) (_int32 = 21) (refiid : _bytes) (result : (_ptr o _com-interface))) ;;; Probe((get-ffi-obj "CoInitialize" ole32 (_fun (_pointer = #f) (_pointer = #f) -> _int -> (void)))); need to be run once before calling any ole-functions (define pIdisp (co-create-instance (progid->clsid "Access.Application") IID_IDispatch))------------------------ Now, we have a pointer to Interface (in terms of COM-technology) stored in pIdisp. From this point, work in OO language is very simple. Calling methods of interface looked like pIdsip.QueryInterface(args...), or pIdsip->QueryInterface(args...). I believe, that all work on the dispatch and execution is done by the compiler. But how can I do this using Racket?I found, that Interface - is just virtual table of methods. So, for example, pointer to QueryInterface placed in point of IDispatch's address (with no offset) and pointer to method AddRef is placed in offset 4 bytes from IDispatch's address... But I still don't know, how to use it.
_________________________________________________ For list-related administrative tasks: http://lists.racket-lang.org/listinfo/dev