rem "FIXME something with 16 bytes instead of Q"$ let Composition := requireModule "Composition" in let dispatch := Composition.dispatch in let (#g) := parseGUID in let IUnknown := ( rem "these miss the self and the world"$ let iid := #g"4711" in let QueryInterface! := accessVMTCell! 'Pipiip in let AddRef! := accessVMTCell! 'Pip in let Release! := accessVMTCell! 'Pip in dispatch [['super []] ['members [['QueryInterface! QueryInterface!] ['AddRef! AddRef!] ['Release! Release!]] ['iid iid]] Object ) in let IDispatch := ( let iID := #g"4712" in let GetTypeInfoCount! := accessVMTCell! 'PLpp in let GetTypeInfo! := accessVMTCell! 'PLpIIp in let GetIDsOfNames! := accessVMTCell! 'PLpQpIIp in let Invoke := accessVMTCell! 'PLpiQIHpppp in let super := IUnknown in dispatch [['super super] ['members (IUnknown.members ++ [['GetTypeInfoCount! GetTypeInfoCount!] ['GetTypeInfo! GetTypeInfo!] ['GetIDsOfNames! GetIDsOfNames!] ['Invoke! Invoke!]])] ['iid iid]] Object ) in let getInterface := (\interface \vtbl dispatch (zipBy (\name \code [name code]) interface.members (unpackRecord (strFromList (map (\i #\p) interface.members)) vtbl)) Object ) in let vtblOfInstance := (\instance head (unpackRecord "p" instance.id)) in let queryInterface! := (\instance \interface vtblOfInstance instance ;\vtbl IUnknown.members.QueryInterface! (head (unpackRecord "p" vtbl)) instance ;\binstance wrap! (getInterface interface vtbl) binstance ) in dispatch [['queryInterface! queryInterface!] ['IUnknown IUnknown] ['IDispatch IDispatch] ] raiseMissingSymbolError