[PATCH 4/5] shlwapi: Implement SHCreateThreadRef
Detlef Riekenberg
wine.dev at web.de
Sun Apr 18 17:45:20 CDT 2010
Now native shdocvw (with native browseui and native browselc)
start in Wine and use our mshtml with gecko.
--
By by ... Detlef
---
dlls/shlwapi/shlwapi.spec | 1 +
dlls/shlwapi/thread.c | 83 +++++++++++++++++++++++++++++++++++++++++++++
include/shlwapi.h | 1 +
3 files changed, 85 insertions(+), 0 deletions(-)
diff --git a/dlls/shlwapi/shlwapi.spec b/dlls/shlwapi/shlwapi.spec
index 367046b..268a2e2 100644
--- a/dlls/shlwapi/shlwapi.spec
+++ b/dlls/shlwapi/shlwapi.spec
@@ -683,6 +683,7 @@
@ stdcall SHCreateStreamOnFileEx(wstr long long long ptr ptr)
@ stdcall SHCreateStreamOnFileW(wstr long ptr)
@ stdcall SHCreateStreamWrapper(ptr ptr long ptr)
+@ stdcall SHCreateThreadRef(ptr ptr)
@ stdcall SHDeleteEmptyKeyA(long ptr)
@ stdcall SHDeleteEmptyKeyW(long ptr)
@ stdcall SHDeleteKeyA(long str)
diff --git a/dlls/shlwapi/thread.c b/dlls/shlwapi/thread.c
index fd9e4ba..9f78e0c 100644
--- a/dlls/shlwapi/thread.c
+++ b/dlls/shlwapi/thread.c
@@ -120,6 +120,89 @@ typedef struct tagSHLWAPI_THREAD_INFO
IUnknown *refIE; /* Reference to the IE process */
} SHLWAPI_THREAD_INFO, *LPSHLWAPI_THREAD_INFO;
+typedef struct
+{
+ void* lpVtbl;
+ LONG *ref;
+} threadref;
+
+static HRESULT WINAPI threadref_QueryInterface(threadref *This, REFIID riid, LPVOID *ppvObj)
+{
+
+ TRACE("(%p, %s, %p)\n", This, debugstr_guid(riid), ppvObj);
+
+ if (ppvObj == NULL)
+ return E_POINTER;
+
+ if (IsEqualGUID(&IID_IUnknown, riid)) {
+ TRACE("(%p)->(IID_IUnknown %p)\n", This, ppvObj);
+ *ppvObj = This;
+ IUnknown_AddRef((IUnknown*)*ppvObj);
+ return S_OK;
+ }
+
+ *ppvObj = NULL;
+ FIXME("(%p, %s, %p) interface not supported\n", This, debugstr_guid(riid), ppvObj);
+ return E_NOINTERFACE;
+}
+
+static ULONG WINAPI threadref_AddRef(threadref *This)
+{
+ TRACE("(%p)\n", This);
+ return InterlockedIncrement(This->ref);
+}
+
+static ULONG WINAPI threadref_Release(threadref *This)
+{
+ LONG refcount;
+
+ TRACE("(%p)\n", This);
+
+ refcount = InterlockedDecrement(This->ref);
+ if (!refcount)
+ HeapFree(GetProcessHeap(), 0, This);
+
+ return refcount;
+}
+
+/* VTable */
+static void* threadref_vt[] =
+{
+ threadref_QueryInterface,
+ threadref_AddRef,
+ threadref_Release
+};
+
+/*************************************************************************
+ * SHCreateThreadRef [SHLWAPI.@]
+ *
+ * Create a per-thread IUnknown object
+ *
+ * PARAMS
+ * lprefcount [I] Pointer to a LONG to be used as refcount
+ * lppUnknown [O] Destination to receive the created object reference
+ *
+ * RETURNS
+ * Success: S_OK. lppUnknown is set to the object reference.
+ * Failure: E_INVALIDARG, if a parameter is NULL
+ */
+HRESULT WINAPI SHCreateThreadRef(LONG *lprefcount, IUnknown **lppUnknown)
+{
+ threadref * This;
+ TRACE("(%p, %p)\n", lprefcount, lppUnknown);
+
+ if (!lprefcount || !lppUnknown)
+ return E_INVALIDARG;
+
+ This = HeapAlloc(GetProcessHeap(), 0, sizeof(threadref));
+ This->lpVtbl = (void*)threadref_vt;
+ This->ref = lprefcount;
+
+ *lprefcount = 1;
+ *lppUnknown = (IUnknown *) This;
+ TRACE("=> returning S_OK with %p\n", This);
+ return S_OK;
+}
/*************************************************************************
* SHGetThreadRef [SHLWAPI.@]
diff --git a/include/shlwapi.h b/include/shlwapi.h
index 223bcdd..d4362ac 100644
--- a/include/shlwapi.h
+++ b/include/shlwapi.h
@@ -974,6 +974,7 @@ HRESULT WINAPI SHCreateStreamWrapper(LPBYTE,DWORD,DWORD,struct IStream**);
HRESULT WINAPI SHAutoComplete(HWND,DWORD);
/* Threads */
+HRESULT WINAPI SHCreateThreadRef(LONG*, IUnknown**);
HRESULT WINAPI SHGetThreadRef(IUnknown**);
HRESULT WINAPI SHSetThreadRef(IUnknown*);
HRESULT WINAPI SHReleaseThreadRef(void);
--
1.7.0.4
More information about the wine-patches
mailing list