Hi all,
I have a C struct as follows:
(defcstruct MyPrivateData (notification io_object_t) (deviceInterface :pointer) ;; void pointer (deviceName CFStringRef) (locationID UInt32))
of which the deviceInterface slot is the one I'm interested in. I need to pass the address of the deviceInterface pointer to a function that sets the pointer to valid device interface struct.
So...
In the sample code from Apple the C function is called like this:
typedef struct MyPrivateData { io_object_t notification; IOUSBDeviceInterface **deviceInterface; CFStringRef deviceName; UInt32 locationID; } MyPrivateData;
IOCFPlugInInterface **plugInInterface = NULL; SInt32 score; HRESULT res;
res = (*plugInInterface)->QueryInterface( plugInInterface, CFUUIDGetUUIDBytes( kIOUSBDeviceInterfaceID ), (LPVOID*) &privateDataRef->deviceInterface );
How would I translate this call into a valid CFFI equivalent ?
I have so far:
(let ((query-interface-ptr (foreign-slot-value plugInInterface 'IOCFPlugInInterface 'ccag.osx.iokit::QueryInterface)))
(format *debug-io* "~%DEVICE-ADDED: query-interface-ptr = ~s." query-interface-ptr)
(setq res (foreign-funcall-pointer query-interface-ptr () :pointer plugInInterface CFUUIDBytes (cf-uuid-get-uuid-bytes kIOUSBDeviceInterfaceID) :pointer (foreign-slot-pointer privateDataRef 'MyPrivateData 'deviceInterface)))
(format *debug-io* "~%DEVICE-ADDED: deviceInterface = ~s." (foreign-slot-value privateDataRef 'MyPrivateData 'deviceInterface))
...
This code "crashes" with signal 100 as reported by AllegroCL in the call to foreign-funcall-pointer ...
Any hints or advice really appreciated!
TIA!
Best wishes Frank