Hi Hans,
Hans Leidekker hans@codeweavers.com wrote:
+struct netprofm_cf +{
- const struct IClassFactoryVtbl *vtbl;
- HRESULT (*create_instance)(void **);
+};
+static inline struct netprofm_cf *impl_from_IClassFactory( IClassFactory *iface ) +{
- return (struct netprofm_cf *)((char *)iface - FIELD_OFFSET( struct netprofm_cf, vtbl ));
+}
Objects in this new dll don't follow http://wiki.winehq.org/COMGuideline, but that's not a big problem, and could be fixed later.
+static HRESULT WINAPI netprofm_cf_CreateInstance( IClassFactory *iface, LPUNKNOWN outer,
REFIID riid, LPVOID *obj )
+{
- struct netprofm_cf *factory = impl_from_IClassFactory( iface );
- IUnknown *unk;
- HRESULT r;
- TRACE( "%p %s %p\n", outer, debugstr_guid(riid), obj );
- *obj = NULL;
- if (outer) return CLASS_E_NOAGGREGATION;
- r = factory->create_instance( (void **)&unk );
- if (FAILED( r ))
return r;
- r = IUnknown_QueryInterface( unk, riid, obj );
- if (FAILED( r ))
return r;
- IUnknown_Release( unk );
- return r;
+}
It seems that 'unk' is leaked if IUnknown_QueryInterface fails.