Update the 'DIRECTDRAW7' flag according to the interface initialized.
diff --git a/dlls/ddraw/ddraw/hal.c b/dlls/ddraw/ddraw/hal.c
index 06042cc..cf69316 100644
--- a/dlls/ddraw/ddraw/hal.c
+++ b/dlls/ddraw/ddraw/hal.c
@@ -335,7 +335,7 @@
{
HRESULT hr;
- TRACE("(%p)\n", This);
+ TRACE("(%p,%d)\n", This, ex);
hr = User_DirectDraw_Construct(This, ex);
if (FAILED(hr)) return hr;
diff --git a/dlls/ddraw/ddraw/thunks.c b/dlls/ddraw/ddraw/thunks.c
index 9bb7a8c..f3f3d2e 100644
--- a/dlls/ddraw/ddraw/thunks.c
+++ b/dlls/ddraw/ddraw/thunks.c
@@ -698,32 +698,48 @@
}
static HRESULT WINAPI
-IDirectDrawImpl_Initialize(LPDIRECTDRAW This, LPGUID pGUID)
+IDirectDrawImpl_Initialize(LPDIRECTDRAW iface, LPGUID pGUID)
{
- return IDirectDraw7_Initialize(COM_INTERFACE_CAST(IDirectDrawImpl,
- IDirectDraw,
- IDirectDraw7, This),
- pGUID);
+ ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw, iface);
+ HRESULT ret_value;
+
+ ret_value = IDirectDraw7_Initialize(ICOM_INTERFACE(This, IDirectDraw7), pGUID);
+
+ /* Overwrite the falsely set 'DIRECTDRAW7' flag */
+ This->local.dwLocalFlags &= ~DDRAWILCL_DIRECTDRAW7;
+
+ return ret_value;
}
static HRESULT WINAPI
-IDirectDraw2Impl_Initialize(LPDIRECTDRAW2 This, LPGUID pGUID)
+IDirectDraw2Impl_Initialize(LPDIRECTDRAW2 iface, LPGUID pGUID)
{
- return IDirectDraw7_Initialize(COM_INTERFACE_CAST(IDirectDrawImpl,
- IDirectDraw2,
- IDirectDraw7, This),
- pGUID);
+ ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw2, iface);
+ HRESULT ret_value;
+
+ ret_value = IDirectDraw7_Initialize(ICOM_INTERFACE(This, IDirectDraw7), pGUID);
+
+ /* Overwrite the falsely set 'DIRECTDRAW7' flag */
+ This->local.dwLocalFlags &= ~DDRAWILCL_DIRECTDRAW7;
+
+ return ret_value;
}
static HRESULT WINAPI
-IDirectDraw4Impl_Initialize(LPDIRECTDRAW4 This, LPGUID pGUID)
+IDirectDraw4Impl_Initialize(LPDIRECTDRAW4 iface, LPGUID pGUID)
{
- return IDirectDraw7_Initialize(COM_INTERFACE_CAST(IDirectDrawImpl,
- IDirectDraw4,
- IDirectDraw7, This),
- pGUID);
+ ICOM_THIS_FROM(IDirectDrawImpl, IDirectDraw4, iface);
+ HRESULT ret_value;
+
+ ret_value = IDirectDraw7_Initialize(ICOM_INTERFACE(This, IDirectDraw7), pGUID);
+
+ /* Overwrite the falsely set 'DIRECTDRAW7' flag */
+ This->local.dwLocalFlags &= ~DDRAWILCL_DIRECTDRAW7;
+
+ return ret_value;
}
+
static HRESULT WINAPI
IDirectDrawImpl_RestoreDisplayMode(LPDIRECTDRAW This)
{
diff --git a/dlls/ddraw/main.c b/dlls/ddraw/main.c
index 7b98266..5e41e3b 100644
--- a/dlls/ddraw/main.c
+++ b/dlls/ddraw/main.c
@@ -241,6 +241,8 @@
LPDIRECTDRAW7 pDD;
HRESULT hr;
+ TRACE("(%s,%p,%p,%d)\n", debugstr_guid(lpGUID), lplpDD, pUnkOuter, ex);
+
if (DDRAW_num_drivers == 0)
{
WARN("no DirectDraw drivers registered\n");
@@ -251,8 +253,6 @@
|| lpGUID == (LPGUID)DDCREATE_HARDWAREONLY)
lpGUID = NULL;
- TRACE("(%s,%p,%p)\n",debugstr_guid(lpGUID),lplpDD,pUnkOuter);
-
if (pUnkOuter != NULL)
return DDERR_INVALIDPARAMS; /* CLASS_E_NOAGGREGATION? */
@@ -277,7 +277,8 @@
HRESULT WINAPI DirectDrawCreate(
LPGUID lpGUID, LPDIRECTDRAW* lplpDD, LPUNKNOWN pUnkOuter
) {
- return DDRAW_Create(lpGUID,(LPVOID*)lplpDD,pUnkOuter,&IID_IDirectDraw,FALSE);
+ TRACE("(%s,%p,%p)\n", debugstr_guid(lpGUID), lplpDD, pUnkOuter);
+ return DDRAW_Create(lpGUID, (LPVOID*) lplpDD, pUnkOuter, &IID_IDirectDraw, FALSE);
}
/***********************************************************************
@@ -290,10 +291,12 @@
HRESULT WINAPI DirectDrawCreateEx(
LPGUID lpGUID, LPVOID* lplpDD, REFIID iid, LPUNKNOWN pUnkOuter
) {
+ TRACE("(%s,%p,%s,%p)\n", debugstr_guid(lpGUID), lplpDD, debugstr_guid(iid), pUnkOuter);
+
if (!IsEqualGUID(iid, &IID_IDirectDraw7))
return DDERR_INVALIDPARAMS;
- return DDRAW_Create(lpGUID, lplpDD, pUnkOuter, iid, TRUE);
+ return DDRAW_Create(lpGUID, lplpDD, pUnkOuter, iid, TRUE);
}
extern HRESULT Uninit_DirectDraw_Create(const GUID*, LPDIRECTDRAW7*,
@@ -305,8 +308,17 @@
{
LPDIRECTDRAW7 pDD;
HRESULT hr;
+ BOOL ex;
- hr = Uninit_DirectDraw_Create(NULL, &pDD, pUnkOuter, TRUE); /* ex? */
+ TRACE("(%p,%s,%p)\n", pUnkOuter, debugstr_guid(iid), ppObj);
+
+ /* This is a mighty hack :-) */
+ if (IsEqualGUID(iid, &IID_IDirectDraw7))
+ ex = TRUE;
+ else
+ ex = FALSE;
+
+ hr = Uninit_DirectDraw_Create(NULL, &pDD, pUnkOuter, ex);
if (FAILED(hr)) return hr;
hr = IDirectDraw7_QueryInterface(pDD, iid, ppObj);
@@ -349,6 +361,8 @@
{
ICOM_THIS(IClassFactoryImpl,iface);
+ TRACE("(%p)->(%s,%p)\n", This, debugstr_guid(riid), ppobj);
+
if (IsEqualGUID(riid, &IID_IUnknown)
|| IsEqualGUID(riid, &IID_IClassFactory))
{
@@ -363,18 +377,21 @@
static ULONG WINAPI DDCF_AddRef(LPCLASSFACTORY iface) {
ICOM_THIS(IClassFactoryImpl,iface);
+
+ TRACE("(%p)->() incrementing from %ld.\n", This, This->ref);
+
return ++(This->ref);
}
static ULONG WINAPI DDCF_Release(LPCLASSFACTORY iface) {
ICOM_THIS(IClassFactoryImpl,iface);
- ULONG ref = --This->ref;
+ TRACE("(%p)->() decrementing from %ld.\n", This, This->ref);
- if (ref == 0)
+ if (--This->ref == 0)
HeapFree(GetProcessHeap(), 0, This);
- return ref;
+ return This->ref;
}