[PATCH 01/14] rpcrt4: Add a stub implementation of CreateProxyFromTypeInfo().
Zebediah Figura
z.figura12 at gmail.com
Sat Nov 3 18:07:13 CDT 2018
Signed-off-by: Zebediah Figura <z.figura12 at gmail.com>
---
dlls/rpcrt4/Makefile.in | 1 +
dlls/rpcrt4/cproxy.c | 47 ++------------------
dlls/rpcrt4/cpsf.h | 20 +++++++++
dlls/rpcrt4/ndr_typelib.c | 93 +++++++++++++++++++++++++++++++++++++++
4 files changed, 118 insertions(+), 43 deletions(-)
create mode 100644 dlls/rpcrt4/ndr_typelib.c
diff --git a/dlls/rpcrt4/Makefile.in b/dlls/rpcrt4/Makefile.in
index 92070ea2c3..ad67edf92e 100644
--- a/dlls/rpcrt4/Makefile.in
+++ b/dlls/rpcrt4/Makefile.in
@@ -15,6 +15,7 @@ C_SRCS = \
ndr_marshall.c \
ndr_ole.c \
ndr_stubless.c \
+ ndr_typelib.c \
rpc_assoc.c \
rpc_async.c \
rpc_binding.c \
diff --git a/dlls/rpcrt4/cproxy.c b/dlls/rpcrt4/cproxy.c
index 71ae560929..7ca05e7248 100644
--- a/dlls/rpcrt4/cproxy.c
+++ b/dlls/rpcrt4/cproxy.c
@@ -42,21 +42,6 @@
WINE_DEFAULT_DEBUG_CHANNEL(ole);
-/* I don't know what MS's std proxy structure looks like,
- so this probably doesn't match, but that shouldn't matter */
-typedef struct {
- IRpcProxyBuffer IRpcProxyBuffer_iface;
- LPVOID *PVtbl;
- LONG RefCount;
- const IID* piid;
- LPUNKNOWN pUnkOuter;
- IUnknown *base_object; /* must be at offset 0x10 from PVtbl */
- IRpcProxyBuffer *base_proxy;
- PCInterfaceName name;
- LPPSFACTORYBUFFER pPSFactory;
- LPRPCCHANNELBUFFER pChannel;
-} StdProxyImpl;
-
static const IRpcProxyBufferVtbl StdProxy_Vtbl;
static inline StdProxyImpl *impl_from_IRpcProxyBuffer(IRpcProxyBuffer *iface)
@@ -296,9 +281,7 @@ HRESULT StdProxy_Construct(REFIID riid,
return S_OK;
}
-static HRESULT WINAPI StdProxy_QueryInterface(LPRPCPROXYBUFFER iface,
- REFIID riid,
- LPVOID *obj)
+HRESULT WINAPI StdProxy_QueryInterface(IRpcProxyBuffer *iface, REFIID riid, void **obj)
{
StdProxyImpl *This = impl_from_IRpcProxyBuffer(iface);
TRACE("(%p)->QueryInterface(%s,%p)\n",This,debugstr_guid(riid),obj);
@@ -319,7 +302,7 @@ static HRESULT WINAPI StdProxy_QueryInterface(LPRPCPROXYBUFFER iface,
return E_NOINTERFACE;
}
-static ULONG WINAPI StdProxy_AddRef(LPRPCPROXYBUFFER iface)
+ULONG WINAPI StdProxy_AddRef(IRpcProxyBuffer *iface)
{
StdProxyImpl *This = impl_from_IRpcProxyBuffer(iface);
TRACE("(%p)->AddRef()\n",This);
@@ -349,8 +332,7 @@ static ULONG WINAPI StdProxy_Release(LPRPCPROXYBUFFER iface)
return refs;
}
-static HRESULT WINAPI StdProxy_Connect(LPRPCPROXYBUFFER iface,
- LPRPCCHANNELBUFFER pChannel)
+HRESULT WINAPI StdProxy_Connect(IRpcProxyBuffer *iface, IRpcChannelBuffer *pChannel)
{
StdProxyImpl *This = impl_from_IRpcProxyBuffer(iface);
TRACE("(%p)->Connect(%p)\n",This,pChannel);
@@ -361,7 +343,7 @@ static HRESULT WINAPI StdProxy_Connect(LPRPCPROXYBUFFER iface,
return S_OK;
}
-static VOID WINAPI StdProxy_Disconnect(LPRPCPROXYBUFFER iface)
+void WINAPI StdProxy_Disconnect(IRpcProxyBuffer *iface)
{
StdProxyImpl *This = impl_from_IRpcProxyBuffer(iface);
TRACE("(%p)->Disconnect()\n",This);
@@ -531,27 +513,6 @@ HRESULT WINAPI NdrProxyErrorHandler(DWORD dwExceptionCode)
return HRESULT_FROM_WIN32(dwExceptionCode);
}
-HRESULT WINAPI
-CreateProxyFromTypeInfo( LPTYPEINFO pTypeInfo, LPUNKNOWN pUnkOuter, REFIID riid,
- LPRPCPROXYBUFFER *ppProxy, LPVOID *ppv )
-{
- typedef INT (WINAPI *MessageBoxA)(HWND,LPCSTR,LPCSTR,UINT);
- HMODULE hUser32 = LoadLibraryA("user32");
- MessageBoxA pMessageBoxA = (void *)GetProcAddress(hUser32, "MessageBoxA");
-
- FIXME("%p %p %s %p %p\n", pTypeInfo, pUnkOuter, debugstr_guid(riid), ppProxy, ppv);
- if (pMessageBoxA)
- {
- pMessageBoxA(NULL,
- "The native implementation of OLEAUT32.DLL cannot be used "
- "with Wine's RPCRT4.DLL. Remove OLEAUT32.DLL and try again.\n",
- "Wine: Unimplemented CreateProxyFromTypeInfo",
- 0x10);
- ExitProcess(1);
- }
- return E_NOTIMPL;
-}
-
HRESULT WINAPI
CreateStubFromTypeInfo(ITypeInfo *pTypeInfo, REFIID riid, IUnknown *pUnkServer,
IRpcStubBuffer **ppStub )
diff --git a/dlls/rpcrt4/cpsf.h b/dlls/rpcrt4/cpsf.h
index 964fb4551f..0ada0d16bb 100644
--- a/dlls/rpcrt4/cpsf.h
+++ b/dlls/rpcrt4/cpsf.h
@@ -21,9 +21,29 @@
#ifndef __WINE_CPSF_H
#define __WINE_CPSF_H
+typedef struct
+{
+ IRpcProxyBuffer IRpcProxyBuffer_iface;
+ void **PVtbl;
+ LONG RefCount;
+ const IID *piid;
+ IUnknown *pUnkOuter;
+ /* offset of base_object from PVtbl must match assembly thunks; see
+ * fill_delegated_proxy_table() */
+ IUnknown *base_object;
+ IRpcProxyBuffer *base_proxy;
+ PCInterfaceName name;
+ IPSFactoryBuffer *pPSFactory;
+ IRpcChannelBuffer *pChannel;
+} StdProxyImpl;
+
HRESULT StdProxy_Construct(REFIID riid, LPUNKNOWN pUnkOuter, const ProxyFileInfo *ProxyInfo,
int Index, LPPSFACTORYBUFFER pPSFactory, LPRPCPROXYBUFFER *ppProxy,
LPVOID *ppvObj) DECLSPEC_HIDDEN;
+HRESULT WINAPI StdProxy_QueryInterface(IRpcProxyBuffer *iface, REFIID iid, void **obj) DECLSPEC_HIDDEN;
+ULONG WINAPI StdProxy_AddRef(IRpcProxyBuffer *iface) DECLSPEC_HIDDEN;
+HRESULT WINAPI StdProxy_Connect(IRpcProxyBuffer *iface, IRpcChannelBuffer *channel) DECLSPEC_HIDDEN;
+void WINAPI StdProxy_Disconnect(IRpcProxyBuffer *iface) DECLSPEC_HIDDEN;
HRESULT CStdStubBuffer_Construct(REFIID riid, LPUNKNOWN pUnkServer, PCInterfaceName name,
CInterfaceStubVtbl *vtbl, LPPSFACTORYBUFFER pPSFactory,
diff --git a/dlls/rpcrt4/ndr_typelib.c b/dlls/rpcrt4/ndr_typelib.c
new file mode 100644
index 0000000000..13075ac571
--- /dev/null
+++ b/dlls/rpcrt4/ndr_typelib.c
@@ -0,0 +1,93 @@
+/*
+ * Type library proxy/stub implementation
+ *
+ * Copyright 2018 Zebediah Figura
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2.1 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+ */
+
+#define COBJMACROS
+#include "oaidl.h"
+#include "rpcproxy.h"
+#include "wine/debug.h"
+#include "wine/heap.h"
+
+#include "cpsf.h"
+
+WINE_DEFAULT_DEBUG_CHANNEL(ole);
+
+struct typelib_proxy
+{
+ StdProxyImpl proxy;
+};
+
+static ULONG WINAPI typelib_proxy_Release(IRpcProxyBuffer *iface)
+{
+ struct typelib_proxy *proxy = CONTAINING_RECORD(iface, struct typelib_proxy, proxy.IRpcProxyBuffer_iface);
+ ULONG refcount = InterlockedDecrement(&proxy->proxy.RefCount);
+
+ TRACE("(%p) decreasing refs to %d\n", proxy, refcount);
+
+ if (!refcount)
+ {
+ heap_free(proxy);
+ }
+ return refcount;
+}
+
+static const IRpcProxyBufferVtbl typelib_proxy_vtbl =
+{
+ StdProxy_QueryInterface,
+ StdProxy_AddRef,
+ typelib_proxy_Release,
+ StdProxy_Connect,
+ StdProxy_Disconnect,
+};
+
+static HRESULT typelib_proxy_init(struct typelib_proxy *proxy, IUnknown *outer,
+ IRpcProxyBuffer **proxy_buffer, void **out)
+{
+ if (!outer) outer = (IUnknown *)&proxy->proxy;
+
+ proxy->proxy.IRpcProxyBuffer_iface.lpVtbl = &typelib_proxy_vtbl;
+ proxy->proxy.RefCount = 1;
+ proxy->proxy.pUnkOuter = outer;
+
+ *proxy_buffer = &proxy->proxy.IRpcProxyBuffer_iface;
+
+ return E_NOTIMPL;
+}
+
+HRESULT WINAPI CreateProxyFromTypeInfo(ITypeInfo *typeinfo, IUnknown *outer,
+ REFIID iid, IRpcProxyBuffer **proxy_buffer, void **out)
+{
+ struct typelib_proxy *proxy;
+ HRESULT hr;
+
+ TRACE("typeinfo %p, outer %p, iid %s, proxy %p, out %p.\n",
+ typeinfo, outer, debugstr_guid(iid), proxy_buffer, out);
+
+ if (!(proxy = heap_alloc_zero(sizeof(*proxy))))
+ {
+ ERR("Failed to allocate proxy object.\n");
+ return E_OUTOFMEMORY;
+ }
+
+ hr = typelib_proxy_init(proxy, outer, proxy_buffer, out);
+ if (FAILED(hr))
+ heap_free(proxy);
+
+ return hr;
+}
--
2.19.1
More information about the wine-devel
mailing list