urlmon: Use an iface instead of a vtbl pointer in stgmed_buf_t.
diff --git a/dlls/urlmon/binding.c b/dlls/urlmon/binding.c
index d5664c7..14f11a7 100644
--- a/dlls/urlmon/binding.c
+++ b/dlls/urlmon/binding.c
@@ -28,7 +28,7 @@
static WCHAR bscb_holderW[] = { '_','B','S','C','B','_','H','o','l','d','e','r','_',0 };
typedef struct {
- const IUnknownVtbl *lpUnknownVtbl;
+ IUnknown IUnknown_iface;
LONG ref;
@@ -55,8 +55,6 @@
const stgmed_obj_vtbl *vtbl;
};
-#define STGMEDUNK(x) ((IUnknown*) &(x)->lpUnknownVtbl)
-
typedef enum {
BEFORE_DOWNLOAD,
DOWNLOADING,
@@ -360,19 +358,22 @@
}
}
-#define STGMEDUNK_THIS(iface) DEFINE_THIS(stgmed_buf_t, Unknown, iface)
+static inline stgmed_buf_t *impl_from_IUnknown(IUnknown *iface)
+{
+ return CONTAINING_RECORD(iface, stgmed_buf_t, IUnknown_iface);
+}
static HRESULT WINAPI StgMedUnk_QueryInterface(IUnknown *iface, REFIID riid, void **ppv)
{
- stgmed_buf_t *This = STGMEDUNK_THIS(iface);
+ stgmed_buf_t *This = impl_from_IUnknown(iface);
*ppv = NULL;
if(IsEqualGUID(riid, &IID_IUnknown)) {
TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv);
- *ppv = STGMEDUNK(This);
- IUnknown_AddRef(STGMEDUNK(This));
+ *ppv = &This->IUnknown_iface;
+ IUnknown_AddRef(&This->IUnknown_iface);
return S_OK;
}
@@ -382,7 +383,7 @@
static ULONG WINAPI StgMedUnk_AddRef(IUnknown *iface)
{
- stgmed_buf_t *This = STGMEDUNK_THIS(iface);
+ stgmed_buf_t *This = impl_from_IUnknown(iface);
LONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p) ref=%d\n", This, ref);
@@ -392,7 +393,7 @@
static ULONG WINAPI StgMedUnk_Release(IUnknown *iface)
{
- stgmed_buf_t *This = STGMEDUNK_THIS(iface);
+ stgmed_buf_t *This = impl_from_IUnknown(iface);
LONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p) ref=%d\n", This, ref);
@@ -410,8 +411,6 @@
return ref;
}
-#undef STGMEDUNK_THIS
-
static const IUnknownVtbl StgMedUnkVtbl = {
StgMedUnk_QueryInterface,
StgMedUnk_AddRef,
@@ -422,7 +421,7 @@
{
stgmed_buf_t *ret = heap_alloc(sizeof(*ret));
- ret->lpUnknownVtbl = &StgMedUnkVtbl;
+ ret->IUnknown_iface.lpVtbl = &StgMedUnkVtbl;
ret->ref = 1;
ret->size = 0;
ret->init = FALSE;
@@ -494,7 +493,7 @@
TRACE("(%p) ref=%d\n", This, ref);
if(!ref) {
- IUnknown_Release(STGMEDUNK(This->buf));
+ IUnknown_Release(&This->buf->IUnknown_iface);
heap_free(This);
URLMON_UnlockModule();
@@ -687,7 +686,7 @@
stgmed->tymed = TYMED_ISTREAM;
stgmed->u.pstm = STREAM(stream);
- stgmed->pUnkForRelease = STGMEDUNK(stream->buf);
+ stgmed->pUnkForRelease = &stream->buf->IUnknown_iface;
return S_OK;
}
@@ -724,7 +723,7 @@
ret->lpStreamVtbl = &ProtocolStreamVtbl;
ret->ref = 1;
- IUnknown_AddRef(STGMEDUNK(buf));
+ IUnknown_AddRef(&buf->IUnknown_iface);
ret->buf = buf;
URLMON_LockModule();
@@ -736,7 +735,7 @@
{
stgmed_file_obj_t *file_obj = (stgmed_file_obj_t*)obj;
- IUnknown_Release(STGMEDUNK(file_obj->buf));
+ IUnknown_Release(&file_obj->buf->IUnknown_iface);
heap_free(file_obj);
}
@@ -753,7 +752,7 @@
stgmed->tymed = TYMED_FILE;
stgmed->u.lpszFileName = file_obj->buf->cache_file;
- stgmed->pUnkForRelease = STGMEDUNK(file_obj->buf);
+ stgmed->pUnkForRelease = &file_obj->buf->IUnknown_iface;
return S_OK;
}
@@ -775,7 +774,7 @@
ret->stgmed_obj.vtbl = &stgmed_file_vtbl;
- IUnknown_AddRef(STGMEDUNK(buf));
+ IUnknown_AddRef(&buf->IUnknown_iface);
ret->buf = buf;
return &ret->stgmed_obj;
@@ -867,7 +866,7 @@
if(This->service_provider)
IServiceProvider_Release(This->service_provider);
if(This->stgmed_buf)
- IUnknown_Release(STGMEDUNK(This->stgmed_buf));
+ IUnknown_Release(&This->stgmed_buf->IUnknown_iface);
if(This->stgmed_obj)
This->stgmed_obj->vtbl->release(This->stgmed_obj);
if(This->obj)
@@ -1499,7 +1498,7 @@
if(binding_ctx) {
ret->stgmed_buf = binding_ctx->stgmed_buf;
- IUnknown_AddRef(STGMEDUNK(ret->stgmed_buf));
+ IUnknown_AddRef(&ret->stgmed_buf->IUnknown_iface);
ret->clipboard_format = binding_ctx->clipboard_format;
}else {
ret->stgmed_buf = create_stgmed_buf(PROTOCOLEX(ret->protocol));