Piotr Caban : oleacc: Add ObjectFromLresult implementation.
Alexandre Julliard
julliard at winehq.org
Fri Apr 25 14:15:25 CDT 2014
Module: wine
Branch: master
Commit: d7000d70533d8a612e6095041e165dc7008b398d
URL: http://source.winehq.org/git/wine.git/?a=commit;h=d7000d70533d8a612e6095041e165dc7008b398d
Author: Piotr Caban <piotr at codeweavers.com>
Date: Fri Apr 25 14:50:37 2014 +0200
oleacc: Add ObjectFromLresult implementation.
---
dlls/oleacc/main.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++--
1 file changed, 66 insertions(+), 2 deletions(-)
diff --git a/dlls/oleacc/main.c b/dlls/oleacc/main.c
index 079b2aa..5a7afd90 100644
--- a/dlls/oleacc/main.c
+++ b/dlls/oleacc/main.c
@@ -46,8 +46,72 @@ HRESULT WINAPI CreateStdAccessibleObject( HWND hwnd, LONG idObject,
HRESULT WINAPI ObjectFromLresult( LRESULT result, REFIID riid, WPARAM wParam, void **ppObject )
{
- FIXME("%ld %s %ld %p\n", result, debugstr_guid(riid), wParam, ppObject );
- return E_NOTIMPL;
+ WCHAR atom_str[sizeof(lresult_atom_prefix)/sizeof(WCHAR)+3*8+3];
+ HANDLE server_proc, server_mapping, mapping;
+ DWORD proc_id, size;
+ IStream *stream;
+ HGLOBAL data;
+ void *view;
+ HRESULT hr;
+ WCHAR *p;
+
+ TRACE("%ld %s %ld %p\n", result, debugstr_guid(riid), wParam, ppObject );
+
+ if(wParam)
+ FIXME("unsupported wParam = %lx\n", wParam);
+
+ if(!ppObject)
+ return E_INVALIDARG;
+ *ppObject = NULL;
+
+ if(result != (ATOM)result)
+ return E_FAIL;
+
+ if(!GlobalGetAtomNameW(result, atom_str, sizeof(atom_str)/sizeof(WCHAR)))
+ return E_FAIL;
+ if(memcmp(atom_str, lresult_atom_prefix, sizeof(lresult_atom_prefix)))
+ return E_FAIL;
+ p = atom_str + sizeof(lresult_atom_prefix)/sizeof(WCHAR);
+ proc_id = strtoulW(p, &p, 16);
+ if(*p != ':')
+ return E_FAIL;
+ server_mapping = ULongToHandle( strtoulW(p+1, &p, 16) );
+ if(*p != ':')
+ return E_FAIL;
+ size = strtoulW(p+1, &p, 16);
+ if(*p != 0)
+ return E_FAIL;
+
+ server_proc = OpenProcess(PROCESS_DUP_HANDLE, FALSE, proc_id);
+ if(!server_proc)
+ return E_FAIL;
+
+ if(!DuplicateHandle(server_proc, server_mapping, GetCurrentProcess(), &mapping,
+ 0, FALSE, DUPLICATE_CLOSE_SOURCE|DUPLICATE_SAME_ACCESS))
+ return E_FAIL;
+ CloseHandle(server_proc);
+ GlobalDeleteAtom(result);
+
+ view = MapViewOfFile(mapping, FILE_MAP_READ, 0, 0, 0);
+ CloseHandle(mapping);
+ if(!view)
+ return E_FAIL;
+
+ data = GlobalAlloc(GMEM_FIXED, size);
+ memcpy(data, view, size);
+ UnmapViewOfFile(view);
+ if(!data)
+ return E_OUTOFMEMORY;
+
+ hr = CreateStreamOnHGlobal(data, TRUE, &stream);
+ if(FAILED(hr)) {
+ GlobalFree(data);
+ return hr;
+ }
+
+ hr = CoUnmarshalInterface(stream, riid, ppObject);
+ IStream_Release(stream);
+ return hr;
}
LRESULT WINAPI LresultFromObject( REFIID riid, WPARAM wParam, LPUNKNOWN pAcc )
More information about the wine-cvs
mailing list