mirror of
https://github.com/reactos/reactos.git
synced 2025-08-05 04:03:05 +00:00
Sync to Wine-20040813:
Alexandre Julliard - Avoid some non-portable makefile constructs, and get rid of the ALTNAMES variable. - Get rid of the non-standard ICOM_VTABLE macro. - Get rid of the non-standard ICOM_VFIELD macro. - Get rid of the non-standard ICOM_DEFINE macro. - Moved ICOM_THIS_MULTI definition out of objbase.h and into the files that use it. Mike McCormack <mike@codeweavers.com> - Added a test for stat'ing a memory based storage file. - stat on memory storage should return a NULL name, not "". Francois Gouget <fgouget@free.fr> - Assorted spelling fixes. - Modify widl to put the C COM macros inside an #ifdef COBJMACROS block as is done in the Windows headers. - Add #define COBJMACROS where needed in Wine. - Fixes the compilation of the oleaut32/tests/olefont.c and urlmon/tests/url.c conformance tests with the Windows headers. Mike Hearn <mh@codeweavers.com> - Implement disconnect for proxies so that stubs are properly destroyed. - Disconnect proxies at COM shutdown to release the corresponding stubs. - Don't marshal IClassFactory into the local server pipe until we have connected, otherwise we might end up with stubs that are never used. - Pass -Embedding switch to EXE servers, more tracing. - Fix misleading warning ole CoGetClassObject. - Fix ref counting in StdMarshalImpl_MarshalInterface for case where the stub already exists. - Implement StdMarshal::ReleaseMarshalData. - Fix infinite loops by checking the return value of _invoke_onereq and bailing appropriately. - Add a comment on the SendReceive behaviour. Improve two others. - Unref stub after invoking on it. Robert Shearman <rob@codeweavers.com> - Remove unneeded STUBMGR_Start call. - Cleanup compobj_private.h. - Fix some inaccuracies in a comment and reformat. - Add static to non-exported marshal functions. - Remove unused marshal functions. - Rename several RPC functions. - Emit fixme for known local wrong behaviour. - Implement StdMarshal::ReleaseMarshalData. - Document wrong behaviour for IRunningObjectTable. - Fix infinite loops by checking the return value of _invoke_onereq and bailing appropriately. - Add a comment on the SendReceive behaviour. Improve two others. - Set RPC data representation. Jeroen Janssen <japj@xs4all.nl> - Updated some MSDN links in the code. svn path=/trunk/; revision=10535
This commit is contained in:
parent
0f2899c24b
commit
73d3df3e28
30 changed files with 519 additions and 327 deletions
|
@ -5,11 +5,8 @@ SRCDIR = @srcdir@
|
||||||
VPATH = @srcdir@
|
VPATH = @srcdir@
|
||||||
MODULE = ole32.dll
|
MODULE = ole32.dll
|
||||||
IMPORTS = advapi32 user32 gdi32 rpcrt4 kernel32 ntdll
|
IMPORTS = advapi32 user32 gdi32 rpcrt4 kernel32 ntdll
|
||||||
ALTNAMES = ole2.dll ole2nls.dll ole2conv.dll ole2prox.dll ole2thk.dll storage.dll compobj.dll
|
|
||||||
EXTRALIBS = -luuid
|
EXTRALIBS = -luuid
|
||||||
|
|
||||||
SPEC_SRCS16 = $(ALTNAMES:.dll=.spec)
|
|
||||||
|
|
||||||
C_SRCS = \
|
C_SRCS = \
|
||||||
antimoniker.c \
|
antimoniker.c \
|
||||||
bindctx.c \
|
bindctx.c \
|
||||||
|
@ -47,6 +44,15 @@ C_SRCS16 = \
|
||||||
ole2nls.c \
|
ole2nls.c \
|
||||||
storage.c
|
storage.c
|
||||||
|
|
||||||
|
SPEC_SRCS16 = \
|
||||||
|
compobj.spec \
|
||||||
|
ole2.spec \
|
||||||
|
ole2conv.spec \
|
||||||
|
ole2nls.spec \
|
||||||
|
ole2prox.spec \
|
||||||
|
ole2thk.spec \
|
||||||
|
storage.spec
|
||||||
|
|
||||||
RC_SRCS = ole32res.rc version.rc
|
RC_SRCS = ole32res.rc version.rc
|
||||||
RC_BINSRC = ole32res.rc
|
RC_BINSRC = ole32res.rc
|
||||||
RC_BINARIES = \
|
RC_BINARIES = \
|
||||||
|
@ -55,6 +61,8 @@ RC_BINARIES = \
|
||||||
drag_move.cur \
|
drag_move.cur \
|
||||||
nodrop.cur
|
nodrop.cur
|
||||||
|
|
||||||
|
SUBDIRS = tests
|
||||||
|
|
||||||
@MAKE_DLL_RULES@
|
@MAKE_DLL_RULES@
|
||||||
|
|
||||||
### Dependencies:
|
### Dependencies:
|
||||||
|
|
|
@ -41,12 +41,12 @@ const CLSID CLSID_AntiMoniker = {
|
||||||
/* AntiMoniker data structure */
|
/* AntiMoniker data structure */
|
||||||
typedef struct AntiMonikerImpl{
|
typedef struct AntiMonikerImpl{
|
||||||
|
|
||||||
ICOM_VTABLE(IMoniker)* lpvtbl1; /* VTable relative to the IMoniker interface.*/
|
IMonikerVtbl* lpvtbl1; /* VTable relative to the IMoniker interface.*/
|
||||||
|
|
||||||
/* The ROT (RunningObjectTable implementation) uses the IROTData interface to test whether
|
/* The ROT (RunningObjectTable implementation) uses the IROTData interface to test whether
|
||||||
* two monikers are equal. That's whay IROTData interface is implemented by monikers.
|
* two monikers are equal. That's whay IROTData interface is implemented by monikers.
|
||||||
*/
|
*/
|
||||||
ICOM_VTABLE(IROTData)* lpvtbl2; /* VTable relative to the IROTData interface.*/
|
IROTDataVtbl* lpvtbl2; /* VTable relative to the IROTData interface.*/
|
||||||
|
|
||||||
ULONG ref; /* reference counter for this object */
|
ULONG ref; /* reference counter for this object */
|
||||||
|
|
||||||
|
@ -104,7 +104,7 @@ HRESULT WINAPI AntiMonikerImpl_Destroy(AntiMonikerImpl* iface);
|
||||||
/********************************************************************************/
|
/********************************************************************************/
|
||||||
/* Virtual function table for the AntiMonikerImpl class which include IPersist,*/
|
/* Virtual function table for the AntiMonikerImpl class which include IPersist,*/
|
||||||
/* IPersistStream and IMoniker functions. */
|
/* IPersistStream and IMoniker functions. */
|
||||||
static ICOM_VTABLE(IMoniker) VT_AntiMonikerImpl =
|
static IMonikerVtbl VT_AntiMonikerImpl =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
AntiMonikerImpl_QueryInterface,
|
AntiMonikerImpl_QueryInterface,
|
||||||
|
@ -134,7 +134,7 @@ static ICOM_VTABLE(IMoniker) VT_AntiMonikerImpl =
|
||||||
|
|
||||||
/********************************************************************************/
|
/********************************************************************************/
|
||||||
/* Virtual function table for the IROTData class. */
|
/* Virtual function table for the IROTData class. */
|
||||||
static ICOM_VTABLE(IROTData) VT_ROTDataImpl =
|
static IROTDataVtbl VT_ROTDataImpl =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
AntiMonikerROTDataImpl_QueryInterface,
|
AntiMonikerROTDataImpl_QueryInterface,
|
||||||
|
|
|
@ -48,7 +48,7 @@ typedef struct BindCtxObject{
|
||||||
/* BindCtx data strucrture */
|
/* BindCtx data strucrture */
|
||||||
typedef struct BindCtxImpl{
|
typedef struct BindCtxImpl{
|
||||||
|
|
||||||
ICOM_VFIELD(IBindCtx); /* VTable relative to the IBindCtx interface.*/
|
IBindCtxVtbl *lpVtbl; /* VTable relative to the IBindCtx interface.*/
|
||||||
|
|
||||||
ULONG ref; /* reference counter for this object */
|
ULONG ref; /* reference counter for this object */
|
||||||
|
|
||||||
|
@ -83,7 +83,7 @@ HRESULT WINAPI BindCtxImpl_Destroy(BindCtxImpl* This);
|
||||||
HRESULT WINAPI BindCtxImpl_GetObjectIndex(BindCtxImpl* This,IUnknown* punk,LPOLESTR pszkey,DWORD *index);
|
HRESULT WINAPI BindCtxImpl_GetObjectIndex(BindCtxImpl* This,IUnknown* punk,LPOLESTR pszkey,DWORD *index);
|
||||||
|
|
||||||
/* Virtual function table for the BindCtx class. */
|
/* Virtual function table for the BindCtx class. */
|
||||||
static ICOM_VTABLE(IBindCtx) VT_BindCtxImpl =
|
static IBindCtxVtbl VT_BindCtxImpl =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
BindCtxImpl_QueryInterface,
|
BindCtxImpl_QueryInterface,
|
||||||
|
@ -269,7 +269,7 @@ HRESULT WINAPI BindCtxImpl_RevokeObjectBound(IBindCtx* iface, IUnknown* punk)
|
||||||
|
|
||||||
TRACE("(%p,%p)\n",This,punk);
|
TRACE("(%p,%p)\n",This,punk);
|
||||||
|
|
||||||
/* check if the object was registred or not */
|
/* check if the object was registered or not */
|
||||||
if (BindCtxImpl_GetObjectIndex(This,punk,NULL,&index)==S_FALSE)
|
if (BindCtxImpl_GetObjectIndex(This,punk,NULL,&index)==S_FALSE)
|
||||||
return MK_E_NOTBOUND;
|
return MK_E_NOTBOUND;
|
||||||
|
|
||||||
|
|
|
@ -94,7 +94,7 @@ struct OLEClipbrd
|
||||||
/*
|
/*
|
||||||
* List all interface VTables here
|
* List all interface VTables here
|
||||||
*/
|
*/
|
||||||
ICOM_VTABLE(IDataObject)* lpvtbl1; /* IDataObject VTable */
|
IDataObjectVtbl* lpvtbl1; /* IDataObject VTable */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The hidden OLE clipboard window. This window is used as the bridge between the
|
* The hidden OLE clipboard window. This window is used as the bridge between the
|
||||||
|
@ -133,7 +133,7 @@ typedef struct OLEClipbrd OLEClipbrd;
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
/* IEnumFORMATETC VTable */
|
/* IEnumFORMATETC VTable */
|
||||||
ICOM_VFIELD(IEnumFORMATETC);
|
IEnumFORMATETCVtbl *lpVtbl;
|
||||||
|
|
||||||
/* IEnumFORMATETC fields */
|
/* IEnumFORMATETC fields */
|
||||||
UINT posFmt; /* current enumerator position */
|
UINT posFmt; /* current enumerator position */
|
||||||
|
@ -248,7 +248,7 @@ static HRESULT WINAPI OLEClipbrd_IEnumFORMATETC_Clone(LPENUMFORMATETC iface, LPE
|
||||||
/*
|
/*
|
||||||
* Virtual function table for the OLEClipbrd's exposed IDataObject interface
|
* Virtual function table for the OLEClipbrd's exposed IDataObject interface
|
||||||
*/
|
*/
|
||||||
static ICOM_VTABLE(IDataObject) OLEClipbrd_IDataObject_VTable =
|
static IDataObjectVtbl OLEClipbrd_IDataObject_VTable =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
OLEClipbrd_IDataObject_QueryInterface,
|
OLEClipbrd_IDataObject_QueryInterface,
|
||||||
|
@ -268,7 +268,7 @@ static ICOM_VTABLE(IDataObject) OLEClipbrd_IDataObject_VTable =
|
||||||
/*
|
/*
|
||||||
* Virtual function table for IEnumFORMATETC interface
|
* Virtual function table for IEnumFORMATETC interface
|
||||||
*/
|
*/
|
||||||
static struct ICOM_VTABLE(IEnumFORMATETC) efvt =
|
static struct IEnumFORMATETCVtbl efvt =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
OLEClipbrd_IEnumFORMATETC_QueryInterface,
|
OLEClipbrd_IEnumFORMATETC_QueryInterface,
|
||||||
|
|
|
@ -152,12 +152,13 @@ void COMPOBJ_InitProcess( void )
|
||||||
{
|
{
|
||||||
WNDCLASSA wclass;
|
WNDCLASSA wclass;
|
||||||
|
|
||||||
/* Inter-thread RPCs are done through window messages rather than pipes. When
|
/* Dispatching to the correct thread in an apartment is done through
|
||||||
an interface is marshalled into another apartment in the same process,
|
* window messages rather than RPC transports. When an interface is
|
||||||
a window of the following class is created. The *caller* of CoMarshalInterface
|
* marshalled into another apartment in the same process, a window of the
|
||||||
(ie the application) is responsible for pumping the message loop in that thread,
|
* following class is created. The *caller* of CoMarshalInterface (ie the
|
||||||
the WM_USER messages which point to the RPCs are then dispatched to COM_AptWndProc
|
* application) is responsible for pumping the message loop in that thread.
|
||||||
by the users code.
|
* The WM_USER messages which point to the RPCs are then dispatched to
|
||||||
|
* COM_AptWndProc by the user's code.
|
||||||
*/
|
*/
|
||||||
memset(&wclass, 0, sizeof(wclass));
|
memset(&wclass, 0, sizeof(wclass));
|
||||||
wclass.lpfnWndProc = &COM_AptWndProc;
|
wclass.lpfnWndProc = &COM_AptWndProc;
|
||||||
|
@ -511,6 +512,11 @@ void WINAPI CoUninitialize(void)
|
||||||
|
|
||||||
RunningObjectTableImpl_UnInitialize();
|
RunningObjectTableImpl_UnInitialize();
|
||||||
|
|
||||||
|
/* disconnect proxies to release the corresponding stubs.
|
||||||
|
* FIXME: native version might not do this and we might just be working
|
||||||
|
* around bugs elsewhere. */
|
||||||
|
MARSHAL_Disconnect_Proxies();
|
||||||
|
|
||||||
/* Release the references to the registered class objects */
|
/* Release the references to the registered class objects */
|
||||||
COM_RevokeAllClasses();
|
COM_RevokeAllClasses();
|
||||||
|
|
||||||
|
@ -903,6 +909,7 @@ HRESULT WINAPI CoGetPSClsid(
|
||||||
/* Open the key.. */
|
/* Open the key.. */
|
||||||
if (RegOpenKeyA(HKEY_CLASSES_ROOT, buf, &xhkey))
|
if (RegOpenKeyA(HKEY_CLASSES_ROOT, buf, &xhkey))
|
||||||
{
|
{
|
||||||
|
WARN("No PSFactoryBuffer object is registered for this IID\n");
|
||||||
HeapFree(GetProcessHeap(),0,buf);
|
HeapFree(GetProcessHeap(),0,buf);
|
||||||
return (E_INVALIDARG);
|
return (E_INVALIDARG);
|
||||||
}
|
}
|
||||||
|
@ -1059,41 +1066,10 @@ _LocalServerThread(LPVOID param) {
|
||||||
ULONG res;
|
ULONG res;
|
||||||
|
|
||||||
TRACE("Starting threader for %s.\n",debugstr_guid(&newClass->classIdentifier));
|
TRACE("Starting threader for %s.\n",debugstr_guid(&newClass->classIdentifier));
|
||||||
|
|
||||||
strcpy(pipefn,PIPEPREF);
|
strcpy(pipefn,PIPEPREF);
|
||||||
WINE_StringFromCLSID(&newClass->classIdentifier,pipefn+strlen(PIPEPREF));
|
WINE_StringFromCLSID(&newClass->classIdentifier,pipefn+strlen(PIPEPREF));
|
||||||
|
|
||||||
hres = IUnknown_QueryInterface(newClass->classObject,&IID_IClassFactory,(LPVOID*)&classfac);
|
|
||||||
if (hres) return hres;
|
|
||||||
|
|
||||||
hres = CreateStreamOnHGlobal(0,TRUE,&pStm);
|
|
||||||
if (hres) {
|
|
||||||
FIXME("Failed to create stream on hglobal.\n");
|
|
||||||
return hres;
|
|
||||||
}
|
|
||||||
hres = CoMarshalInterface(pStm,&IID_IClassFactory,(LPVOID)classfac,0,NULL,0);
|
|
||||||
if (hres) {
|
|
||||||
FIXME("CoMarshalInterface failed, %lx!\n",hres);
|
|
||||||
return hres;
|
|
||||||
}
|
|
||||||
hres = IStream_Stat(pStm,&ststg,0);
|
|
||||||
if (hres) return hres;
|
|
||||||
|
|
||||||
buflen = ststg.cbSize.u.LowPart;
|
|
||||||
buffer = HeapAlloc(GetProcessHeap(),0,buflen);
|
|
||||||
seekto.u.LowPart = 0;
|
|
||||||
seekto.u.HighPart = 0;
|
|
||||||
hres = IStream_Seek(pStm,seekto,SEEK_SET,&newpos);
|
|
||||||
if (hres) {
|
|
||||||
FIXME("IStream_Seek failed, %lx\n",hres);
|
|
||||||
return hres;
|
|
||||||
}
|
|
||||||
hres = IStream_Read(pStm,buffer,buflen,&res);
|
|
||||||
if (hres) {
|
|
||||||
FIXME("Stream Read failed, %lx\n",hres);
|
|
||||||
return hres;
|
|
||||||
}
|
|
||||||
IStream_Release(pStm);
|
|
||||||
|
|
||||||
hPipe = CreateNamedPipeA( pipefn, PIPE_ACCESS_DUPLEX,
|
hPipe = CreateNamedPipeA( pipefn, PIPE_ACCESS_DUPLEX,
|
||||||
PIPE_TYPE_BYTE|PIPE_WAIT, PIPE_UNLIMITED_INSTANCES,
|
PIPE_TYPE_BYTE|PIPE_WAIT, PIPE_UNLIMITED_INSTANCES,
|
||||||
4096, 4096, NMPWAIT_USE_DEFAULT_WAIT, NULL );
|
4096, 4096, NMPWAIT_USE_DEFAULT_WAIT, NULL );
|
||||||
|
@ -1106,9 +1082,51 @@ _LocalServerThread(LPVOID param) {
|
||||||
ERR("Failure during ConnectNamedPipe %lx, ABORT!\n",GetLastError());
|
ERR("Failure during ConnectNamedPipe %lx, ABORT!\n",GetLastError());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TRACE("marshalling IClassFactory to client\n");
|
||||||
|
|
||||||
|
hres = IUnknown_QueryInterface(newClass->classObject,&IID_IClassFactory,(LPVOID*)&classfac);
|
||||||
|
if (hres) return hres;
|
||||||
|
|
||||||
|
hres = CreateStreamOnHGlobal(0,TRUE,&pStm);
|
||||||
|
if (hres) {
|
||||||
|
FIXME("Failed to create stream on hglobal.\n");
|
||||||
|
return hres;
|
||||||
|
}
|
||||||
|
hres = CoMarshalInterface(pStm,&IID_IClassFactory,(LPVOID)classfac,0,NULL,0);
|
||||||
|
if (hres) {
|
||||||
|
FIXME("CoMarshalInterface failed, %lx!\n",hres);
|
||||||
|
return hres;
|
||||||
|
}
|
||||||
|
|
||||||
|
IUnknown_Release(classfac); /* is this right? */
|
||||||
|
|
||||||
|
hres = IStream_Stat(pStm,&ststg,0);
|
||||||
|
if (hres) return hres;
|
||||||
|
|
||||||
|
buflen = ststg.cbSize.u.LowPart;
|
||||||
|
buffer = HeapAlloc(GetProcessHeap(),0,buflen);
|
||||||
|
seekto.u.LowPart = 0;
|
||||||
|
seekto.u.HighPart = 0;
|
||||||
|
hres = IStream_Seek(pStm,seekto,SEEK_SET,&newpos);
|
||||||
|
if (hres) {
|
||||||
|
FIXME("IStream_Seek failed, %lx\n",hres);
|
||||||
|
return hres;
|
||||||
|
}
|
||||||
|
|
||||||
|
hres = IStream_Read(pStm,buffer,buflen,&res);
|
||||||
|
if (hres) {
|
||||||
|
FIXME("Stream Read failed, %lx\n",hres);
|
||||||
|
return hres;
|
||||||
|
}
|
||||||
|
|
||||||
|
IStream_Release(pStm);
|
||||||
|
|
||||||
WriteFile(hPipe,buffer,buflen,&res,NULL);
|
WriteFile(hPipe,buffer,buflen,&res,NULL);
|
||||||
FlushFileBuffers(hPipe);
|
FlushFileBuffers(hPipe);
|
||||||
DisconnectNamedPipe(hPipe);
|
DisconnectNamedPipe(hPipe);
|
||||||
|
|
||||||
|
TRACE("done marshalling IClassFactory\n");
|
||||||
}
|
}
|
||||||
CloseHandle(hPipe);
|
CloseHandle(hPipe);
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -1352,7 +1370,7 @@ HRESULT WINAPI CoGetClassObject(
|
||||||
|
|
||||||
if ( compobj_RegReadPath(keyname, NULL, dllpath, sizeof(dllpath)) != ERROR_SUCCESS) {
|
if ( compobj_RegReadPath(keyname, NULL, dllpath, sizeof(dllpath)) != ERROR_SUCCESS) {
|
||||||
/* failure: CLSID is not found in registry */
|
/* failure: CLSID is not found in registry */
|
||||||
WARN("class %s not registred\n", xclsid);
|
WARN("class %s not registered inproc\n", xclsid);
|
||||||
hres = REGDB_E_CLASSNOTREG;
|
hres = REGDB_E_CLASSNOTREG;
|
||||||
} else {
|
} else {
|
||||||
if ((hLibrary = LoadLibraryExA(dllpath, 0, LOAD_WITH_ALTERED_SEARCH_PATH)) == 0) {
|
if ((hLibrary = LoadLibraryExA(dllpath, 0, LOAD_WITH_ALTERED_SEARCH_PATH)) == 0) {
|
||||||
|
|
|
@ -55,7 +55,7 @@ typedef struct tagXIF {
|
||||||
|
|
||||||
/* exported object */
|
/* exported object */
|
||||||
typedef struct tagXOBJECT {
|
typedef struct tagXOBJECT {
|
||||||
ICOM_VTABLE(IRpcStubBuffer) *lpVtbl;
|
IRpcStubBufferVtbl *lpVtbl;
|
||||||
struct tagAPARTMENT *parent;
|
struct tagAPARTMENT *parent;
|
||||||
struct tagXOBJECT *next;
|
struct tagXOBJECT *next;
|
||||||
LPUNKNOWN obj; /* object identity (IUnknown) */
|
LPUNKNOWN obj; /* object identity (IUnknown) */
|
||||||
|
@ -78,7 +78,7 @@ typedef struct tagIIF {
|
||||||
|
|
||||||
/* imported object */
|
/* imported object */
|
||||||
typedef struct tagIOBJECT {
|
typedef struct tagIOBJECT {
|
||||||
ICOM_VTABLE(IRemUnknown) *lpVtbl;
|
IRemUnknownVtbl *lpVtbl;
|
||||||
struct tagAPARTMENT *parent;
|
struct tagAPARTMENT *parent;
|
||||||
struct tagIOBJECT *next;
|
struct tagIOBJECT *next;
|
||||||
LPRPCCHANNELBUFFER chan; /* channel to object */
|
LPRPCCHANNELBUFFER chan; /* channel to object */
|
||||||
|
@ -118,18 +118,9 @@ extern HRESULT create_marshalled_proxy(REFCLSID rclsid, REFIID iid, LPVOID *ppv)
|
||||||
|
|
||||||
extern void* StdGlobalInterfaceTableInstance;
|
extern void* StdGlobalInterfaceTableInstance;
|
||||||
|
|
||||||
inline static HRESULT
|
|
||||||
get_facbuf_for_iid(REFIID riid,IPSFactoryBuffer **facbuf) {
|
|
||||||
HRESULT hres;
|
|
||||||
CLSID pxclsid;
|
|
||||||
|
|
||||||
if ((hres = CoGetPSClsid(riid,&pxclsid)))
|
|
||||||
return hres;
|
|
||||||
return CoGetClassObject(&pxclsid,CLSCTX_INPROC_SERVER,NULL,&IID_IPSFactoryBuffer,(LPVOID*)facbuf);
|
|
||||||
}
|
|
||||||
|
|
||||||
#define PIPEPREF "\\\\.\\pipe\\"
|
#define PIPEPREF "\\\\.\\pipe\\"
|
||||||
#define OLESTUBMGR PIPEPREF"WINE_OLE_StubMgr"
|
#define OLESTUBMGR PIPEPREF"WINE_OLE_StubMgr"
|
||||||
|
|
||||||
/* Standard Marshalling definitions */
|
/* Standard Marshalling definitions */
|
||||||
typedef struct _wine_marshal_id {
|
typedef struct _wine_marshal_id {
|
||||||
DWORD processid;
|
DWORD processid;
|
||||||
|
@ -156,41 +147,11 @@ MARSHAL_Compare_Mids_NoInterface(wine_marshal_id *mid1, wine_marshal_id *mid2) {
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT MARSHAL_Find_Stub_Buffer(wine_marshal_id *mid,IRpcStubBuffer **stub);
|
HRESULT MARSHAL_Find_Stub_Buffer(wine_marshal_id *mid,IRpcStubBuffer **stub);
|
||||||
HRESULT MARSHAL_Find_Stub_Server(wine_marshal_id *mid,LPUNKNOWN *punk);
|
void MARSHAL_Invalidate_Stub_From_MID(wine_marshal_id *mid);
|
||||||
HRESULT MARSHAL_Register_Stub(wine_marshal_id *mid,LPUNKNOWN punk, IRpcStubBuffer *stub);
|
HRESULT MARSHAL_Disconnect_Proxies();
|
||||||
|
|
||||||
HRESULT MARSHAL_GetStandardMarshalCF(LPVOID *ppv);
|
HRESULT MARSHAL_GetStandardMarshalCF(LPVOID *ppv);
|
||||||
|
|
||||||
typedef struct _wine_marshal_data {
|
|
||||||
DWORD dwDestContext;
|
|
||||||
DWORD mshlflags;
|
|
||||||
} wine_marshal_data;
|
|
||||||
|
|
||||||
|
|
||||||
#define REQTYPE_REQUEST 0
|
|
||||||
typedef struct _wine_rpc_request_header {
|
|
||||||
DWORD reqid;
|
|
||||||
wine_marshal_id mid;
|
|
||||||
DWORD iMethod;
|
|
||||||
DWORD cbBuffer;
|
|
||||||
} wine_rpc_request_header;
|
|
||||||
|
|
||||||
#define REQTYPE_RESPONSE 1
|
|
||||||
typedef struct _wine_rpc_response_header {
|
|
||||||
DWORD reqid;
|
|
||||||
DWORD cbBuffer;
|
|
||||||
DWORD retval;
|
|
||||||
} wine_rpc_response_header;
|
|
||||||
|
|
||||||
#define REQSTATE_START 0
|
|
||||||
#define REQSTATE_REQ_QUEUED 1
|
|
||||||
#define REQSTATE_REQ_WAITING_FOR_REPLY 2
|
|
||||||
#define REQSTATE_REQ_GOT 3
|
|
||||||
#define REQSTATE_INVOKING 4
|
|
||||||
#define REQSTATE_RESP_QUEUED 5
|
|
||||||
#define REQSTATE_RESP_GOT 6
|
|
||||||
#define REQSTATE_DONE 6
|
|
||||||
|
|
||||||
void STUBMGR_Start();
|
void STUBMGR_Start();
|
||||||
|
|
||||||
extern HRESULT PIPE_GetNewPipeBuf(wine_marshal_id *mid, IRpcChannelBuffer **pipebuf);
|
extern HRESULT PIPE_GetNewPipeBuf(wine_marshal_id *mid, IRpcChannelBuffer **pipebuf);
|
||||||
|
@ -228,4 +189,6 @@ static inline APARTMENT* COM_CurrentApt(void)
|
||||||
APARTMENT* COM_CreateApartment(DWORD model);
|
APARTMENT* COM_CreateApartment(DWORD model);
|
||||||
HWND COM_GetApartmentWin(OXID oxid);
|
HWND COM_GetApartmentWin(OXID oxid);
|
||||||
|
|
||||||
|
#define ICOM_THIS_MULTI(impl,field,iface) impl* const This=(impl*)((char*)(iface) - offsetof(impl,field))
|
||||||
|
|
||||||
#endif /* __WINE_OLE_COMPOBJ_H */
|
#endif /* __WINE_OLE_COMPOBJ_H */
|
||||||
|
|
|
@ -44,13 +44,13 @@ const CLSID CLSID_CompositeMoniker = {
|
||||||
/* CompositeMoniker data structure */
|
/* CompositeMoniker data structure */
|
||||||
typedef struct CompositeMonikerImpl{
|
typedef struct CompositeMonikerImpl{
|
||||||
|
|
||||||
ICOM_VTABLE(IMoniker)* lpvtbl1; /* VTable relative to the IMoniker interface.*/
|
IMonikerVtbl* lpvtbl1; /* VTable relative to the IMoniker interface.*/
|
||||||
|
|
||||||
/* The ROT (RunningObjectTable implementation) uses the IROTData
|
/* The ROT (RunningObjectTable implementation) uses the IROTData
|
||||||
* interface to test whether two monikers are equal. That's why IROTData
|
* interface to test whether two monikers are equal. That's why IROTData
|
||||||
* interface is implemented by monikers.
|
* interface is implemented by monikers.
|
||||||
*/
|
*/
|
||||||
ICOM_VTABLE(IROTData)* lpvtbl2; /* VTable relative to the IROTData interface.*/
|
IROTDataVtbl* lpvtbl2; /* VTable relative to the IROTData interface.*/
|
||||||
|
|
||||||
ULONG ref; /* reference counter for this object */
|
ULONG ref; /* reference counter for this object */
|
||||||
|
|
||||||
|
@ -66,7 +66,7 @@ typedef struct CompositeMonikerImpl{
|
||||||
/* EnumMoniker data structure */
|
/* EnumMoniker data structure */
|
||||||
typedef struct EnumMonikerImpl{
|
typedef struct EnumMonikerImpl{
|
||||||
|
|
||||||
ICOM_VFIELD(IEnumMoniker); /* VTable relative to the IEnumMoniker interface.*/
|
IEnumMonikerVtbl *lpVtbl; /* VTable relative to the IEnumMoniker interface.*/
|
||||||
|
|
||||||
ULONG ref; /* reference counter for this object */
|
ULONG ref; /* reference counter for this object */
|
||||||
|
|
||||||
|
@ -148,7 +148,7 @@ HRESULT WINAPI EnumMonikerImpl_CreateEnumMoniker(IMoniker** tabMoniker,ULONG tab
|
||||||
/* Virtual function table for the CompositeMonikerImpl class which includes */
|
/* Virtual function table for the CompositeMonikerImpl class which includes */
|
||||||
/* IPersist, IPersistStream and IMoniker functions. */
|
/* IPersist, IPersistStream and IMoniker functions. */
|
||||||
|
|
||||||
static ICOM_VTABLE(IMoniker) VT_CompositeMonikerImpl =
|
static IMonikerVtbl VT_CompositeMonikerImpl =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
CompositeMonikerImpl_QueryInterface,
|
CompositeMonikerImpl_QueryInterface,
|
||||||
|
@ -178,7 +178,7 @@ static ICOM_VTABLE(IMoniker) VT_CompositeMonikerImpl =
|
||||||
|
|
||||||
/********************************************************************************/
|
/********************************************************************************/
|
||||||
/* Virtual function table for the IROTData class. */
|
/* Virtual function table for the IROTData class. */
|
||||||
static ICOM_VTABLE(IROTData) VT_ROTDataImpl =
|
static IROTDataVtbl VT_ROTDataImpl =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
CompositeMonikerROTDataImpl_QueryInterface,
|
CompositeMonikerROTDataImpl_QueryInterface,
|
||||||
|
@ -189,7 +189,7 @@ static ICOM_VTABLE(IROTData) VT_ROTDataImpl =
|
||||||
|
|
||||||
/********************************************************************************/
|
/********************************************************************************/
|
||||||
/* Virtual function table for the IROTData class */
|
/* Virtual function table for the IROTData class */
|
||||||
static ICOM_VTABLE(IEnumMoniker) VT_EnumMonikerImpl =
|
static IEnumMonikerVtbl VT_EnumMonikerImpl =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
EnumMonikerImpl_QueryInterface,
|
EnumMonikerImpl_QueryInterface,
|
||||||
|
|
|
@ -91,12 +91,12 @@ struct DataCache
|
||||||
/*
|
/*
|
||||||
* List all interface VTables here
|
* List all interface VTables here
|
||||||
*/
|
*/
|
||||||
ICOM_VTABLE(IDataObject)* lpvtbl1;
|
IDataObjectVtbl* lpvtbl1;
|
||||||
ICOM_VTABLE(IUnknown)* lpvtbl2;
|
IUnknownVtbl* lpvtbl2;
|
||||||
ICOM_VTABLE(IPersistStorage)* lpvtbl3;
|
IPersistStorageVtbl* lpvtbl3;
|
||||||
ICOM_VTABLE(IViewObject2)* lpvtbl4;
|
IViewObject2Vtbl* lpvtbl4;
|
||||||
ICOM_VTABLE(IOleCache2)* lpvtbl5;
|
IOleCache2Vtbl* lpvtbl5;
|
||||||
ICOM_VTABLE(IOleCacheControl)* lpvtbl6;
|
IOleCacheControlVtbl* lpvtbl6;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Reference count of this object
|
* Reference count of this object
|
||||||
|
@ -373,7 +373,7 @@ static HRESULT WINAPI DataCache_OnStop(
|
||||||
/*
|
/*
|
||||||
* Virtual function tables for the DataCache class.
|
* Virtual function tables for the DataCache class.
|
||||||
*/
|
*/
|
||||||
static ICOM_VTABLE(IUnknown) DataCache_NDIUnknown_VTable =
|
static IUnknownVtbl DataCache_NDIUnknown_VTable =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
DataCache_NDIUnknown_QueryInterface,
|
DataCache_NDIUnknown_QueryInterface,
|
||||||
|
@ -381,7 +381,7 @@ static ICOM_VTABLE(IUnknown) DataCache_NDIUnknown_VTable =
|
||||||
DataCache_NDIUnknown_Release
|
DataCache_NDIUnknown_Release
|
||||||
};
|
};
|
||||||
|
|
||||||
static ICOM_VTABLE(IDataObject) DataCache_IDataObject_VTable =
|
static IDataObjectVtbl DataCache_IDataObject_VTable =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
DataCache_IDataObject_QueryInterface,
|
DataCache_IDataObject_QueryInterface,
|
||||||
|
@ -398,7 +398,7 @@ static ICOM_VTABLE(IDataObject) DataCache_IDataObject_VTable =
|
||||||
DataCache_EnumDAdvise
|
DataCache_EnumDAdvise
|
||||||
};
|
};
|
||||||
|
|
||||||
static ICOM_VTABLE(IPersistStorage) DataCache_IPersistStorage_VTable =
|
static IPersistStorageVtbl DataCache_IPersistStorage_VTable =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
DataCache_IPersistStorage_QueryInterface,
|
DataCache_IPersistStorage_QueryInterface,
|
||||||
|
@ -413,7 +413,7 @@ static ICOM_VTABLE(IPersistStorage) DataCache_IPersistStorage_VTable =
|
||||||
DataCache_HandsOffStorage
|
DataCache_HandsOffStorage
|
||||||
};
|
};
|
||||||
|
|
||||||
static ICOM_VTABLE(IViewObject2) DataCache_IViewObject2_VTable =
|
static IViewObject2Vtbl DataCache_IViewObject2_VTable =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
DataCache_IViewObject2_QueryInterface,
|
DataCache_IViewObject2_QueryInterface,
|
||||||
|
@ -428,7 +428,7 @@ static ICOM_VTABLE(IViewObject2) DataCache_IViewObject2_VTable =
|
||||||
DataCache_GetExtent
|
DataCache_GetExtent
|
||||||
};
|
};
|
||||||
|
|
||||||
static ICOM_VTABLE(IOleCache2) DataCache_IOleCache2_VTable =
|
static IOleCache2Vtbl DataCache_IOleCache2_VTable =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
DataCache_IOleCache2_QueryInterface,
|
DataCache_IOleCache2_QueryInterface,
|
||||||
|
@ -443,7 +443,7 @@ static ICOM_VTABLE(IOleCache2) DataCache_IOleCache2_VTable =
|
||||||
DataCache_DiscardCache
|
DataCache_DiscardCache
|
||||||
};
|
};
|
||||||
|
|
||||||
static ICOM_VTABLE(IOleCacheControl) DataCache_IOleCacheControl_VTable =
|
static IOleCacheControlVtbl DataCache_IOleCacheControl_VTable =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
DataCache_IOleCacheControl_QueryInterface,
|
DataCache_IOleCacheControl_QueryInterface,
|
||||||
|
|
|
@ -68,10 +68,10 @@ struct DefaultHandler
|
||||||
/*
|
/*
|
||||||
* List all interface VTables here
|
* List all interface VTables here
|
||||||
*/
|
*/
|
||||||
ICOM_VTABLE(IOleObject)* lpvtbl1;
|
IOleObjectVtbl* lpvtbl1;
|
||||||
ICOM_VTABLE(IUnknown)* lpvtbl2;
|
IUnknownVtbl* lpvtbl2;
|
||||||
ICOM_VTABLE(IDataObject)* lpvtbl3;
|
IDataObjectVtbl* lpvtbl3;
|
||||||
ICOM_VTABLE(IRunnableObject)* lpvtbl4;
|
IRunnableObjectVtbl* lpvtbl4;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Reference count of this object
|
* Reference count of this object
|
||||||
|
@ -323,7 +323,7 @@ static HRESULT WINAPI DefaultHandler_SetContainedObject(
|
||||||
/*
|
/*
|
||||||
* Virtual function tables for the DefaultHandler class.
|
* Virtual function tables for the DefaultHandler class.
|
||||||
*/
|
*/
|
||||||
static ICOM_VTABLE(IOleObject) DefaultHandler_IOleObject_VTable =
|
static IOleObjectVtbl DefaultHandler_IOleObject_VTable =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
DefaultHandler_QueryInterface,
|
DefaultHandler_QueryInterface,
|
||||||
|
@ -352,7 +352,7 @@ static ICOM_VTABLE(IOleObject) DefaultHandler_IOleObject_VTable =
|
||||||
DefaultHandler_SetColorScheme
|
DefaultHandler_SetColorScheme
|
||||||
};
|
};
|
||||||
|
|
||||||
static ICOM_VTABLE(IUnknown) DefaultHandler_NDIUnknown_VTable =
|
static IUnknownVtbl DefaultHandler_NDIUnknown_VTable =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
DefaultHandler_NDIUnknown_QueryInterface,
|
DefaultHandler_NDIUnknown_QueryInterface,
|
||||||
|
@ -360,7 +360,7 @@ static ICOM_VTABLE(IUnknown) DefaultHandler_NDIUnknown_VTable =
|
||||||
DefaultHandler_NDIUnknown_Release,
|
DefaultHandler_NDIUnknown_Release,
|
||||||
};
|
};
|
||||||
|
|
||||||
static ICOM_VTABLE(IDataObject) DefaultHandler_IDataObject_VTable =
|
static IDataObjectVtbl DefaultHandler_IDataObject_VTable =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
DefaultHandler_IDataObject_QueryInterface,
|
DefaultHandler_IDataObject_QueryInterface,
|
||||||
|
@ -377,7 +377,7 @@ static ICOM_VTABLE(IDataObject) DefaultHandler_IDataObject_VTable =
|
||||||
DefaultHandler_EnumDAdvise
|
DefaultHandler_EnumDAdvise
|
||||||
};
|
};
|
||||||
|
|
||||||
static ICOM_VTABLE(IRunnableObject) DefaultHandler_IRunnableObject_VTable =
|
static IRunnableObjectVtbl DefaultHandler_IRunnableObject_VTable =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
DefaultHandler_IRunnableObject_QueryInterface,
|
DefaultHandler_IRunnableObject_QueryInterface,
|
||||||
|
|
|
@ -26,6 +26,8 @@
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
#include <string.h>
|
#include <string.h>
|
||||||
|
|
||||||
|
#define COBJMACROS
|
||||||
|
|
||||||
#include "windef.h"
|
#include "windef.h"
|
||||||
#include "winbase.h"
|
#include "winbase.h"
|
||||||
#include "oleauto.h"
|
#include "oleauto.h"
|
||||||
|
@ -127,9 +129,9 @@ static VOID WINAPI ERRORINFO_SysFreeString(BSTR in)
|
||||||
|
|
||||||
typedef struct ErrorInfoImpl
|
typedef struct ErrorInfoImpl
|
||||||
{
|
{
|
||||||
ICOM_VTABLE(IErrorInfo) *lpvtei;
|
IErrorInfoVtbl *lpvtei;
|
||||||
ICOM_VTABLE(ICreateErrorInfo) *lpvtcei;
|
ICreateErrorInfoVtbl *lpvtcei;
|
||||||
ICOM_VTABLE(ISupportErrorInfo) *lpvtsei;
|
ISupportErrorInfoVtbl *lpvtsei;
|
||||||
DWORD ref;
|
DWORD ref;
|
||||||
|
|
||||||
GUID m_Guid;
|
GUID m_Guid;
|
||||||
|
@ -139,9 +141,9 @@ typedef struct ErrorInfoImpl
|
||||||
DWORD m_dwHelpContext;
|
DWORD m_dwHelpContext;
|
||||||
} ErrorInfoImpl;
|
} ErrorInfoImpl;
|
||||||
|
|
||||||
static ICOM_VTABLE(IErrorInfo) IErrorInfoImpl_VTable;
|
static IErrorInfoVtbl IErrorInfoImpl_VTable;
|
||||||
static ICOM_VTABLE(ICreateErrorInfo) ICreateErrorInfoImpl_VTable;
|
static ICreateErrorInfoVtbl ICreateErrorInfoImpl_VTable;
|
||||||
static ICOM_VTABLE(ISupportErrorInfo) ISupportErrorInfoImpl_VTable;
|
static ISupportErrorInfoVtbl ISupportErrorInfoImpl_VTable;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
converts a objectpointer to This
|
converts a objectpointer to This
|
||||||
|
@ -300,7 +302,7 @@ static HRESULT WINAPI IErrorInfoImpl_GetHelpContext(
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ICOM_VTABLE(IErrorInfo) IErrorInfoImpl_VTable =
|
static IErrorInfoVtbl IErrorInfoImpl_VTable =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
IErrorInfoImpl_QueryInterface,
|
IErrorInfoImpl_QueryInterface,
|
||||||
|
@ -402,7 +404,7 @@ static HRESULT WINAPI ICreateErrorInfoImpl_SetHelpContext(
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ICOM_VTABLE(ICreateErrorInfo) ICreateErrorInfoImpl_VTable =
|
static ICreateErrorInfoVtbl ICreateErrorInfoImpl_VTable =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
ICreateErrorInfoImpl_QueryInterface,
|
ICreateErrorInfoImpl_QueryInterface,
|
||||||
|
@ -453,7 +455,7 @@ static HRESULT WINAPI ISupportErrorInfoImpl_InterfaceSupportsErrorInfo(
|
||||||
return (IsEqualIID(riid, &This->m_Guid)) ? S_OK : S_FALSE;
|
return (IsEqualIID(riid, &This->m_Guid)) ? S_OK : S_FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ICOM_VTABLE(ISupportErrorInfo) ISupportErrorInfoImpl_VTable =
|
static ISupportErrorInfoVtbl ISupportErrorInfoImpl_VTable =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
ISupportErrorInfoImpl_QueryInterface,
|
ISupportErrorInfoImpl_QueryInterface,
|
||||||
|
|
|
@ -44,12 +44,12 @@ const CLSID CLSID_FileMoniker = {
|
||||||
/* filemoniker data structure */
|
/* filemoniker data structure */
|
||||||
typedef struct FileMonikerImpl{
|
typedef struct FileMonikerImpl{
|
||||||
|
|
||||||
ICOM_VTABLE(IMoniker)* lpvtbl1; /* VTable relative to the IMoniker interface.*/
|
IMonikerVtbl* lpvtbl1; /* VTable relative to the IMoniker interface.*/
|
||||||
|
|
||||||
/* The ROT (RunningObjectTable implementation) uses the IROTData interface to test whether
|
/* The ROT (RunningObjectTable implementation) uses the IROTData interface to test whether
|
||||||
* two monikers are equal. That's whay IROTData interface is implemented by monikers.
|
* two monikers are equal. That's whay IROTData interface is implemented by monikers.
|
||||||
*/
|
*/
|
||||||
ICOM_VTABLE(IROTData)* lpvtbl2; /* VTable relative to the IROTData interface.*/
|
IROTDataVtbl* lpvtbl2; /* VTable relative to the IROTData interface.*/
|
||||||
|
|
||||||
ULONG ref; /* reference counter for this object */
|
ULONG ref; /* reference counter for this object */
|
||||||
|
|
||||||
|
@ -111,7 +111,7 @@ int WINAPI FileMonikerImpl_DecomposePath(LPCOLESTR str, LPOLESTR** tabStr);
|
||||||
/********************************************************************************/
|
/********************************************************************************/
|
||||||
/* Virtual function table for the FileMonikerImpl class which include IPersist,*/
|
/* Virtual function table for the FileMonikerImpl class which include IPersist,*/
|
||||||
/* IPersistStream and IMoniker functions. */
|
/* IPersistStream and IMoniker functions. */
|
||||||
static ICOM_VTABLE(IMoniker) VT_FileMonikerImpl =
|
static IMonikerVtbl VT_FileMonikerImpl =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
FileMonikerImpl_QueryInterface,
|
FileMonikerImpl_QueryInterface,
|
||||||
|
@ -141,7 +141,7 @@ static ICOM_VTABLE(IMoniker) VT_FileMonikerImpl =
|
||||||
|
|
||||||
/********************************************************************************/
|
/********************************************************************************/
|
||||||
/* Virtual function table for the IROTData class. */
|
/* Virtual function table for the IROTData class. */
|
||||||
static ICOM_VTABLE(IROTData) VT_ROTDataImpl =
|
static IROTDataVtbl VT_ROTDataImpl =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
FileMonikerROTDataImpl_QueryInterface,
|
FileMonikerROTDataImpl_QueryInterface,
|
||||||
|
@ -983,7 +983,7 @@ HRESULT WINAPI FileMonikerImpl_GetTimeOfLastChange(IMoniker* iface,
|
||||||
|
|
||||||
res= IRunningObjectTable_GetTimeOfLastChange(rot,iface,pFileTime);
|
res= IRunningObjectTable_GetTimeOfLastChange(rot,iface,pFileTime);
|
||||||
|
|
||||||
if (FAILED(res)){ /* the moniker is not registred */
|
if (FAILED(res)){ /* the moniker is not registered */
|
||||||
|
|
||||||
if (!GetFileAttributesExW(This->filePathName,GetFileExInfoStandard,&info))
|
if (!GetFileAttributesExW(This->filePathName,GetFileExInfoStandard,&info))
|
||||||
return MK_E_NOOBJECT;
|
return MK_E_NOOBJECT;
|
||||||
|
|
|
@ -35,9 +35,9 @@
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(ole);
|
WINE_DEFAULT_DEBUG_CHANNEL(ole);
|
||||||
|
|
||||||
typedef struct _FTMarshalImpl {
|
typedef struct _FTMarshalImpl {
|
||||||
ICOM_VFIELD (IUnknown);
|
IUnknownVtbl *lpVtbl;
|
||||||
DWORD ref;
|
DWORD ref;
|
||||||
ICOM_VTABLE (IMarshal) * lpvtblFTM;
|
IMarshalVtbl *lpvtblFTM;
|
||||||
|
|
||||||
IUnknown *pUnkOuter;
|
IUnknown *pUnkOuter;
|
||||||
} FTMarshalImpl;
|
} FTMarshalImpl;
|
||||||
|
@ -90,7 +90,7 @@ ULONG WINAPI IiFTMUnknown_fnRelease (IUnknown * iface)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ICOM_VTABLE (IUnknown) iunkvt =
|
static IUnknownVtbl iunkvt =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
IiFTMUnknown_fnQueryInterface,
|
IiFTMUnknown_fnQueryInterface,
|
||||||
|
@ -201,7 +201,7 @@ HRESULT WINAPI FTMarshalImpl_DisconnectObject (LPMARSHAL iface, DWORD dwReserved
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
ICOM_VTABLE (IMarshal) ftmvtbl =
|
IMarshalVtbl ftmvtbl =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
FTMarshalImpl_QueryInterface,
|
FTMarshalImpl_QueryInterface,
|
||||||
|
|
|
@ -70,7 +70,7 @@ typedef struct StdGITEntry
|
||||||
/* Class data */
|
/* Class data */
|
||||||
typedef struct StdGlobalInterfaceTableImpl
|
typedef struct StdGlobalInterfaceTableImpl
|
||||||
{
|
{
|
||||||
ICOM_VFIELD(IGlobalInterfaceTable);
|
IGlobalInterfaceTableVtbl *lpVtbl;
|
||||||
|
|
||||||
ULONG ref;
|
ULONG ref;
|
||||||
struct StdGITEntry* firstEntry;
|
struct StdGITEntry* firstEntry;
|
||||||
|
@ -92,7 +92,7 @@ static HRESULT WINAPI StdGlobalInterfaceTable_RevokeInterfaceFromGlobal(IGlobalI
|
||||||
static HRESULT WINAPI StdGlobalInterfaceTable_GetInterfaceFromGlobal(IGlobalInterfaceTable* iface, DWORD dwCookie, REFIID riid, void **ppv);
|
static HRESULT WINAPI StdGlobalInterfaceTable_GetInterfaceFromGlobal(IGlobalInterfaceTable* iface, DWORD dwCookie, REFIID riid, void **ppv);
|
||||||
|
|
||||||
/* Virtual function table */
|
/* Virtual function table */
|
||||||
static ICOM_VTABLE(IGlobalInterfaceTable) StdGlobalInterfaceTableImpl_Vtbl =
|
static IGlobalInterfaceTableVtbl StdGlobalInterfaceTableImpl_Vtbl =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
StdGlobalInterfaceTable_QueryInterface,
|
StdGlobalInterfaceTable_QueryInterface,
|
||||||
|
@ -349,7 +349,7 @@ static HRESULT WINAPI GITCF_LockServer(LPCLASSFACTORY iface, BOOL fLock) {
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ICOM_VTABLE(IClassFactory) GITClassFactoryVtbl = {
|
static IClassFactoryVtbl GITClassFactoryVtbl = {
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
GITCF_QueryInterface,
|
GITCF_QueryInterface,
|
||||||
GITCF_AddRef,
|
GITCF_AddRef,
|
||||||
|
@ -357,7 +357,7 @@ static ICOM_VTABLE(IClassFactory) GITClassFactoryVtbl = {
|
||||||
GITCF_CreateInstance,
|
GITCF_CreateInstance,
|
||||||
GITCF_LockServer
|
GITCF_LockServer
|
||||||
};
|
};
|
||||||
static ICOM_VTABLE(IClassFactory) *PGITClassFactoryVtbl = &GITClassFactoryVtbl;
|
static IClassFactoryVtbl *PGITClassFactoryVtbl = &GITClassFactoryVtbl;
|
||||||
|
|
||||||
HRESULT StdGlobalInterfaceTable_GetFactory(LPVOID *ppv) {
|
HRESULT StdGlobalInterfaceTable_GetFactory(LPVOID *ppv) {
|
||||||
*ppv = &PGITClassFactoryVtbl;
|
*ppv = &PGITClassFactoryVtbl;
|
||||||
|
|
|
@ -52,7 +52,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(storage);
|
||||||
*/
|
*/
|
||||||
struct HGLOBALStreamImpl
|
struct HGLOBALStreamImpl
|
||||||
{
|
{
|
||||||
ICOM_VFIELD(IStream); /* Needs to be the first item in the stuct
|
IStreamVtbl *lpVtbl; /* Needs to be the first item in the stuct
|
||||||
* since we want to cast this in a IStream pointer */
|
* since we want to cast this in a IStream pointer */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -169,7 +169,7 @@ HRESULT WINAPI HGLOBALStreamImpl_Clone(
|
||||||
/*
|
/*
|
||||||
* Virtual function table for the HGLOBALStreamImpl class.
|
* Virtual function table for the HGLOBALStreamImpl class.
|
||||||
*/
|
*/
|
||||||
static ICOM_VTABLE(IStream) HGLOBALStreamImpl_Vtbl =
|
static IStreamVtbl HGLOBALStreamImpl_Vtbl =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
HGLOBALStreamImpl_QueryInterface,
|
HGLOBALStreamImpl_QueryInterface,
|
||||||
|
|
|
@ -45,10 +45,10 @@ WINE_DEFAULT_DEBUG_CHANNEL(olemalloc);
|
||||||
*
|
*
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/* set the vtable later */
|
/* set the vtable later */
|
||||||
static ICOM_VTABLE(IMalloc) VT_IMalloc32;
|
static IMallocVtbl VT_IMalloc32;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
ICOM_VFIELD(IMalloc);
|
IMallocVtbl *lpVtbl;
|
||||||
DWORD dummy; /* nothing, we are static */
|
DWORD dummy; /* nothing, we are static */
|
||||||
IMallocSpy * pSpy; /* the spy when active */
|
IMallocSpy * pSpy; /* the spy when active */
|
||||||
DWORD SpyedAllocationsLeft; /* number of spyed allocations left */
|
DWORD SpyedAllocationsLeft; /* number of spyed allocations left */
|
||||||
|
@ -342,7 +342,7 @@ static VOID WINAPI IMalloc_fnHeapMinimize(LPMALLOC iface) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static ICOM_VTABLE(IMalloc) VT_IMalloc32 =
|
static IMallocVtbl VT_IMalloc32 =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
IMalloc_fnQueryInterface,
|
IMalloc_fnQueryInterface,
|
||||||
|
@ -361,10 +361,10 @@ static ICOM_VTABLE(IMalloc) VT_IMalloc32 =
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
|
|
||||||
/* set the vtable later */
|
/* set the vtable later */
|
||||||
static ICOM_VTABLE(IMallocSpy) VT_IMallocSpy;
|
static IMallocSpyVtbl VT_IMallocSpy;
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
ICOM_VFIELD(IMallocSpy);
|
IMallocSpyVtbl *lpVtbl;
|
||||||
DWORD ref;
|
DWORD ref;
|
||||||
} _MallocSpy;
|
} _MallocSpy;
|
||||||
|
|
||||||
|
@ -502,7 +502,7 @@ static void MallocSpyDumpLeaks() {
|
||||||
TRACE("leaks: %lu\n", Malloc32.SpyedAllocationsLeft);
|
TRACE("leaks: %lu\n", Malloc32.SpyedAllocationsLeft);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ICOM_VTABLE(IMallocSpy) VT_IMallocSpy =
|
static IMallocSpyVtbl VT_IMallocSpy =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
IMallocSpy_fnQueryInterface,
|
IMallocSpy_fnQueryInterface,
|
||||||
|
|
|
@ -33,8 +33,6 @@ typedef LPCSTR LPCOLESTR16;
|
||||||
* IMalloc16 interface
|
* IMalloc16 interface
|
||||||
*/
|
*/
|
||||||
|
|
||||||
typedef struct IMalloc16 IMalloc16, *LPMALLOC16;
|
|
||||||
|
|
||||||
#undef INTERFACE
|
#undef INTERFACE
|
||||||
#define INTERFACE IMalloc16
|
#define INTERFACE IMalloc16
|
||||||
#define IMalloc16_METHODS \
|
#define IMalloc16_METHODS \
|
||||||
|
@ -45,17 +43,17 @@ typedef struct IMalloc16 IMalloc16, *LPMALLOC16;
|
||||||
STDMETHOD_(DWORD,GetSize)(THIS_ LPVOID pv) PURE; \
|
STDMETHOD_(DWORD,GetSize)(THIS_ LPVOID pv) PURE; \
|
||||||
STDMETHOD_(INT16,DidAlloc)(THIS_ LPVOID pv) PURE; \
|
STDMETHOD_(INT16,DidAlloc)(THIS_ LPVOID pv) PURE; \
|
||||||
STDMETHOD_(LPVOID,HeapMinimize)(THIS) PURE;
|
STDMETHOD_(LPVOID,HeapMinimize)(THIS) PURE;
|
||||||
ICOM_DEFINE(IMalloc16,IUnknown)
|
DECLARE_INTERFACE_(IMalloc16,IUnknown) { IMalloc16_METHODS };
|
||||||
#undef INTERFACE
|
#undef INTERFACE
|
||||||
|
|
||||||
|
typedef struct IMalloc16 *LPMALLOC16;
|
||||||
|
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
|
|
||||||
extern LPMALLOC16 IMalloc16_Constructor();
|
extern LPMALLOC16 IMalloc16_Constructor();
|
||||||
|
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
|
|
||||||
typedef struct ILockBytes16 *LPLOCKBYTES16, ILockBytes16;
|
|
||||||
|
|
||||||
#define INTERFACE ILockBytes
|
#define INTERFACE ILockBytes
|
||||||
#define ILockBytes16_METHODS \
|
#define ILockBytes16_METHODS \
|
||||||
IUnknown_METHODS \
|
IUnknown_METHODS \
|
||||||
|
@ -66,7 +64,7 @@ typedef struct ILockBytes16 *LPLOCKBYTES16, ILockBytes16;
|
||||||
STDMETHOD(LockRegion)(THIS_ ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType) PURE; \
|
STDMETHOD(LockRegion)(THIS_ ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType) PURE; \
|
||||||
STDMETHOD(UnlockRegion)(THIS_ ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType) PURE; \
|
STDMETHOD(UnlockRegion)(THIS_ ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType) PURE; \
|
||||||
STDMETHOD(Stat)(THIS_ STATSTG *pstatstg, DWORD grfStatFlag) PURE;
|
STDMETHOD(Stat)(THIS_ STATSTG *pstatstg, DWORD grfStatFlag) PURE;
|
||||||
ICOM_DEFINE(ILockBytes16,IUnknown)
|
DECLARE_INTERFACE_(ILockBytes16,IUnknown) { ILockBytes16_METHODS };
|
||||||
#undef INTERFACE
|
#undef INTERFACE
|
||||||
|
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
|
@ -86,8 +84,6 @@ typedef struct tagSTATSTG16
|
||||||
DWORD reserved;
|
DWORD reserved;
|
||||||
} STATSTG16;
|
} STATSTG16;
|
||||||
|
|
||||||
typedef struct IStream16 IStream16, *LPSTREAM16;
|
|
||||||
|
|
||||||
#define INTERFACE IStream16
|
#define INTERFACE IStream16
|
||||||
#define IStream16_METHODS \
|
#define IStream16_METHODS \
|
||||||
ISequentialStream_METHODS \
|
ISequentialStream_METHODS \
|
||||||
|
@ -100,15 +96,13 @@ typedef struct IStream16 IStream16, *LPSTREAM16;
|
||||||
STDMETHOD(UnlockRegion)(THIS_ ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType) PURE; \
|
STDMETHOD(UnlockRegion)(THIS_ ULARGE_INTEGER libOffset, ULARGE_INTEGER cb, DWORD dwLockType) PURE; \
|
||||||
STDMETHOD(Stat)(THIS_ STATSTG* pstatstg, DWORD grfStatFlag) PURE; \
|
STDMETHOD(Stat)(THIS_ STATSTG* pstatstg, DWORD grfStatFlag) PURE; \
|
||||||
STDMETHOD(Clone)(THIS_ IStream16** ppstm) PURE;
|
STDMETHOD(Clone)(THIS_ IStream16** ppstm) PURE;
|
||||||
ICOM_DEFINE(IStream16,ISequentialStream)
|
DECLARE_INTERFACE_(IStream16,ISequentialStream) { IStream16_METHODS };
|
||||||
#undef INTERFACE
|
#undef INTERFACE
|
||||||
|
|
||||||
/**********************************************************************/
|
/**********************************************************************/
|
||||||
|
|
||||||
typedef OLECHAR16 **SNB16;
|
typedef OLECHAR16 **SNB16;
|
||||||
|
|
||||||
typedef struct IStorage16 IStorage16, *LPSTORAGE16;
|
|
||||||
|
|
||||||
#define INTERFACE IStorage16
|
#define INTERFACE IStorage16
|
||||||
#define IStorage16_METHODS \
|
#define IStorage16_METHODS \
|
||||||
IUnknown_METHODS \
|
IUnknown_METHODS \
|
||||||
|
@ -127,7 +121,7 @@ typedef struct IStorage16 IStorage16, *LPSTORAGE16;
|
||||||
STDMETHOD_(HRESULT,SetClass)(THIS_ REFCLSID clsid) PURE; \
|
STDMETHOD_(HRESULT,SetClass)(THIS_ REFCLSID clsid) PURE; \
|
||||||
STDMETHOD_(HRESULT,SetStateBits)(THIS_ DWORD grfStateBits, DWORD grfMask) PURE; \
|
STDMETHOD_(HRESULT,SetStateBits)(THIS_ DWORD grfStateBits, DWORD grfMask) PURE; \
|
||||||
STDMETHOD_(HRESULT,Stat)(THIS_ STATSTG* pstatstg, DWORD grfStatFlag) PURE;
|
STDMETHOD_(HRESULT,Stat)(THIS_ STATSTG* pstatstg, DWORD grfStatFlag) PURE;
|
||||||
ICOM_DEFINE(IStorage16,IUnknown)
|
DECLARE_INTERFACE_(IStorage16,IUnknown) { IStorage16_METHODS };
|
||||||
#undef INTERFACE
|
#undef INTERFACE
|
||||||
|
|
||||||
#endif /* __WINE_OLE_IFS_H */
|
#endif /* __WINE_OLE_IFS_H */
|
||||||
|
|
|
@ -43,12 +43,12 @@ const CLSID CLSID_ItemMoniker = {
|
||||||
/* ItemMoniker data structure */
|
/* ItemMoniker data structure */
|
||||||
typedef struct ItemMonikerImpl{
|
typedef struct ItemMonikerImpl{
|
||||||
|
|
||||||
ICOM_VTABLE(IMoniker)* lpvtbl1; /* VTable relative to the IMoniker interface.*/
|
IMonikerVtbl* lpvtbl1; /* VTable relative to the IMoniker interface.*/
|
||||||
|
|
||||||
/* The ROT (RunningObjectTable implementation) uses the IROTData interface to test whether
|
/* The ROT (RunningObjectTable implementation) uses the IROTData interface to test whether
|
||||||
* two monikers are equal. That's whay IROTData interface is implemented by monikers.
|
* two monikers are equal. That's whay IROTData interface is implemented by monikers.
|
||||||
*/
|
*/
|
||||||
ICOM_VTABLE(IROTData)* lpvtbl2; /* VTable relative to the IROTData interface.*/
|
IROTDataVtbl* lpvtbl2; /* VTable relative to the IROTData interface.*/
|
||||||
|
|
||||||
ULONG ref; /* reference counter for this object */
|
ULONG ref; /* reference counter for this object */
|
||||||
|
|
||||||
|
@ -110,7 +110,7 @@ static HRESULT WINAPI ItemMonikerROTDataImpl_GetComparaisonData(IROTData* iface,
|
||||||
/********************************************************************************/
|
/********************************************************************************/
|
||||||
/* Virtual function table for the ItemMonikerImpl class which include IPersist,*/
|
/* Virtual function table for the ItemMonikerImpl class which include IPersist,*/
|
||||||
/* IPersistStream and IMoniker functions. */
|
/* IPersistStream and IMoniker functions. */
|
||||||
static ICOM_VTABLE(IMoniker) VT_ItemMonikerImpl =
|
static IMonikerVtbl VT_ItemMonikerImpl =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
ItemMonikerImpl_QueryInterface,
|
ItemMonikerImpl_QueryInterface,
|
||||||
|
@ -140,7 +140,7 @@ static ICOM_VTABLE(IMoniker) VT_ItemMonikerImpl =
|
||||||
|
|
||||||
/********************************************************************************/
|
/********************************************************************************/
|
||||||
/* Virtual function table for the IROTData class. */
|
/* Virtual function table for the IROTData class. */
|
||||||
static ICOM_VTABLE(IROTData) VT_ROTDataImpl =
|
static IROTDataVtbl VT_ROTDataImpl =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
ItemMonikerROTDataImpl_QueryInterface,
|
ItemMonikerROTDataImpl_QueryInterface,
|
||||||
|
|
|
@ -58,6 +58,21 @@ extern const CLSID CLSID_DfMarshal;
|
||||||
* Note that the IUnknown_QI(ob,xiid,&ppv) always returns the SAME ppv value!
|
* Note that the IUnknown_QI(ob,xiid,&ppv) always returns the SAME ppv value!
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
inline static HRESULT
|
||||||
|
get_facbuf_for_iid(REFIID riid,IPSFactoryBuffer **facbuf) {
|
||||||
|
HRESULT hres;
|
||||||
|
CLSID pxclsid;
|
||||||
|
|
||||||
|
if ((hres = CoGetPSClsid(riid,&pxclsid)))
|
||||||
|
return hres;
|
||||||
|
return CoGetClassObject(&pxclsid,CLSCTX_INPROC_SERVER,NULL,&IID_IPSFactoryBuffer,(LPVOID*)facbuf);
|
||||||
|
}
|
||||||
|
|
||||||
|
typedef struct _wine_marshal_data {
|
||||||
|
DWORD dwDestContext;
|
||||||
|
DWORD mshlflags;
|
||||||
|
} wine_marshal_data;
|
||||||
|
|
||||||
typedef struct _mid2unknown {
|
typedef struct _mid2unknown {
|
||||||
wine_marshal_id mid;
|
wine_marshal_id mid;
|
||||||
LPUNKNOWN pUnk;
|
LPUNKNOWN pUnk;
|
||||||
|
@ -67,6 +82,7 @@ typedef struct _mid2stub {
|
||||||
wine_marshal_id mid;
|
wine_marshal_id mid;
|
||||||
IRpcStubBuffer *stub;
|
IRpcStubBuffer *stub;
|
||||||
LPUNKNOWN pUnkServer;
|
LPUNKNOWN pUnkServer;
|
||||||
|
BOOL valid;
|
||||||
} mid2stub;
|
} mid2stub;
|
||||||
|
|
||||||
static mid2stub *stubs = NULL;
|
static mid2stub *stubs = NULL;
|
||||||
|
@ -75,18 +91,19 @@ static int nrofstubs = 0;
|
||||||
static mid2unknown *proxies = NULL;
|
static mid2unknown *proxies = NULL;
|
||||||
static int nrofproxies = 0;
|
static int nrofproxies = 0;
|
||||||
|
|
||||||
HRESULT
|
void MARSHAL_Invalidate_Stub_From_MID(wine_marshal_id *mid) {
|
||||||
MARSHAL_Find_Stub_Server(wine_marshal_id *mid,LPUNKNOWN *punk) {
|
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i=0;i<nrofstubs;i++) {
|
for (i=0;i<nrofstubs;i++) {
|
||||||
if (MARSHAL_Compare_Mids_NoInterface(mid,&(stubs[i].mid))) {
|
if (!stubs[i].valid) continue;
|
||||||
*punk = stubs[i].pUnkServer;
|
|
||||||
IUnknown_AddRef((*punk));
|
if (MARSHAL_Compare_Mids(mid,&(stubs[i].mid))) {
|
||||||
return S_OK;
|
stubs[i].valid = FALSE;
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return E_FAIL;
|
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT
|
HRESULT
|
||||||
|
@ -94,6 +111,8 @@ MARSHAL_Find_Stub_Buffer(wine_marshal_id *mid,IRpcStubBuffer **stub) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i=0;i<nrofstubs;i++) {
|
for (i=0;i<nrofstubs;i++) {
|
||||||
|
if (!stubs[i].valid) continue;
|
||||||
|
|
||||||
if (MARSHAL_Compare_Mids(mid,&(stubs[i].mid))) {
|
if (MARSHAL_Compare_Mids(mid,&(stubs[i].mid))) {
|
||||||
*stub = stubs[i].stub;
|
*stub = stubs[i].stub;
|
||||||
IUnknown_AddRef((*stub));
|
IUnknown_AddRef((*stub));
|
||||||
|
@ -103,11 +122,13 @@ MARSHAL_Find_Stub_Buffer(wine_marshal_id *mid,IRpcStubBuffer **stub) {
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT
|
static HRESULT
|
||||||
MARSHAL_Find_Stub(wine_marshal_id *mid,LPUNKNOWN *pUnk) {
|
MARSHAL_Find_Stub(wine_marshal_id *mid,LPUNKNOWN *pUnk) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i=0;i<nrofstubs;i++) {
|
for (i=0;i<nrofstubs;i++) {
|
||||||
|
if (!stubs[i].valid) continue;
|
||||||
|
|
||||||
if (MARSHAL_Compare_Mids(mid,&(stubs[i].mid))) {
|
if (MARSHAL_Compare_Mids(mid,&(stubs[i].mid))) {
|
||||||
*pUnk = stubs[i].pUnkServer;
|
*pUnk = stubs[i].pUnkServer;
|
||||||
IUnknown_AddRef((*pUnk));
|
IUnknown_AddRef((*pUnk));
|
||||||
|
@ -117,7 +138,7 @@ MARSHAL_Find_Stub(wine_marshal_id *mid,LPUNKNOWN *pUnk) {
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT
|
static HRESULT
|
||||||
MARSHAL_Register_Stub(wine_marshal_id *mid,LPUNKNOWN pUnk,IRpcStubBuffer *stub) {
|
MARSHAL_Register_Stub(wine_marshal_id *mid,LPUNKNOWN pUnk,IRpcStubBuffer *stub) {
|
||||||
LPUNKNOWN xPunk;
|
LPUNKNOWN xPunk;
|
||||||
if (!MARSHAL_Find_Stub(mid,&xPunk)) {
|
if (!MARSHAL_Find_Stub(mid,&xPunk)) {
|
||||||
|
@ -132,37 +153,24 @@ MARSHAL_Register_Stub(wine_marshal_id *mid,LPUNKNOWN pUnk,IRpcStubBuffer *stub)
|
||||||
stubs[nrofstubs].stub = stub;
|
stubs[nrofstubs].stub = stub;
|
||||||
stubs[nrofstubs].pUnkServer = pUnk;
|
stubs[nrofstubs].pUnkServer = pUnk;
|
||||||
memcpy(&(stubs[nrofstubs].mid),mid,sizeof(*mid));
|
memcpy(&(stubs[nrofstubs].mid),mid,sizeof(*mid));
|
||||||
|
stubs[nrofstubs].valid = TRUE; /* set to false when released by ReleaseMarshalData */
|
||||||
nrofstubs++;
|
nrofstubs++;
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT
|
HRESULT
|
||||||
MARSHAL_Find_Proxy(wine_marshal_id *mid,LPUNKNOWN *punk) {
|
MARSHAL_Disconnect_Proxies() {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
for (i=0;i<nrofproxies;i++)
|
TRACE("Disconnecting %d proxies\n", nrofproxies);
|
||||||
if (MARSHAL_Compare_Mids(mid,&(proxies[i].mid))) {
|
|
||||||
*punk = proxies[i].pUnk;
|
for (i = 0; i < nrofproxies; i++)
|
||||||
IUnknown_AddRef((*punk));
|
IRpcProxyBuffer_Disconnect((IRpcProxyBuffer*)proxies[i].pUnk);
|
||||||
return S_OK;
|
|
||||||
}
|
return S_OK;
|
||||||
return E_FAIL;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT
|
static HRESULT
|
||||||
MARSHAL_Find_Proxy_Object(wine_marshal_id *mid,LPUNKNOWN *punk) {
|
|
||||||
int i;
|
|
||||||
|
|
||||||
for (i=0;i<nrofproxies;i++)
|
|
||||||
if (MARSHAL_Compare_Mids_NoInterface(mid,&(proxies[i].mid))) {
|
|
||||||
*punk = proxies[i].pUnk;
|
|
||||||
IUnknown_AddRef((*punk));
|
|
||||||
return S_OK;
|
|
||||||
}
|
|
||||||
return E_FAIL;
|
|
||||||
}
|
|
||||||
|
|
||||||
HRESULT
|
|
||||||
MARSHAL_Register_Proxy(wine_marshal_id *mid,LPUNKNOWN punk) {
|
MARSHAL_Register_Proxy(wine_marshal_id *mid,LPUNKNOWN punk) {
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
|
@ -185,7 +193,7 @@ MARSHAL_Register_Proxy(wine_marshal_id *mid,LPUNKNOWN punk) {
|
||||||
|
|
||||||
/********************** StdMarshal implementation ****************************/
|
/********************** StdMarshal implementation ****************************/
|
||||||
typedef struct _StdMarshalImpl {
|
typedef struct _StdMarshalImpl {
|
||||||
ICOM_VTABLE(IMarshal) *lpvtbl;
|
IMarshalVtbl *lpvtbl;
|
||||||
DWORD ref;
|
DWORD ref;
|
||||||
|
|
||||||
IID iid;
|
IID iid;
|
||||||
|
@ -194,7 +202,7 @@ typedef struct _StdMarshalImpl {
|
||||||
DWORD mshlflags;
|
DWORD mshlflags;
|
||||||
} StdMarshalImpl;
|
} StdMarshalImpl;
|
||||||
|
|
||||||
HRESULT WINAPI
|
static HRESULT WINAPI
|
||||||
StdMarshalImpl_QueryInterface(LPMARSHAL iface,REFIID riid,LPVOID *ppv) {
|
StdMarshalImpl_QueryInterface(LPMARSHAL iface,REFIID riid,LPVOID *ppv) {
|
||||||
*ppv = NULL;
|
*ppv = NULL;
|
||||||
if (IsEqualIID(&IID_IUnknown,riid) || IsEqualIID(&IID_IMarshal,riid)) {
|
if (IsEqualIID(&IID_IUnknown,riid) || IsEqualIID(&IID_IMarshal,riid)) {
|
||||||
|
@ -206,14 +214,14 @@ StdMarshalImpl_QueryInterface(LPMARSHAL iface,REFIID riid,LPVOID *ppv) {
|
||||||
return E_NOINTERFACE;
|
return E_NOINTERFACE;
|
||||||
}
|
}
|
||||||
|
|
||||||
ULONG WINAPI
|
static ULONG WINAPI
|
||||||
StdMarshalImpl_AddRef(LPMARSHAL iface) {
|
StdMarshalImpl_AddRef(LPMARSHAL iface) {
|
||||||
ICOM_THIS(StdMarshalImpl,iface);
|
ICOM_THIS(StdMarshalImpl,iface);
|
||||||
This->ref++;
|
This->ref++;
|
||||||
return This->ref;
|
return This->ref;
|
||||||
}
|
}
|
||||||
|
|
||||||
ULONG WINAPI
|
static ULONG WINAPI
|
||||||
StdMarshalImpl_Release(LPMARSHAL iface) {
|
StdMarshalImpl_Release(LPMARSHAL iface) {
|
||||||
ICOM_THIS(StdMarshalImpl,iface);
|
ICOM_THIS(StdMarshalImpl,iface);
|
||||||
This->ref--;
|
This->ref--;
|
||||||
|
@ -224,7 +232,7 @@ StdMarshalImpl_Release(LPMARSHAL iface) {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT WINAPI
|
static HRESULT WINAPI
|
||||||
StdMarshalImpl_GetUnmarshalClass(
|
StdMarshalImpl_GetUnmarshalClass(
|
||||||
LPMARSHAL iface, REFIID riid, void* pv, DWORD dwDestContext,
|
LPMARSHAL iface, REFIID riid, void* pv, DWORD dwDestContext,
|
||||||
void* pvDestContext, DWORD mshlflags, CLSID* pCid
|
void* pvDestContext, DWORD mshlflags, CLSID* pCid
|
||||||
|
@ -233,7 +241,7 @@ StdMarshalImpl_GetUnmarshalClass(
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT WINAPI
|
static HRESULT WINAPI
|
||||||
StdMarshalImpl_GetMarshalSizeMax(
|
StdMarshalImpl_GetMarshalSizeMax(
|
||||||
LPMARSHAL iface, REFIID riid, void* pv, DWORD dwDestContext,
|
LPMARSHAL iface, REFIID riid, void* pv, DWORD dwDestContext,
|
||||||
void* pvDestContext, DWORD mshlflags, DWORD* pSize
|
void* pvDestContext, DWORD mshlflags, DWORD* pSize
|
||||||
|
@ -242,7 +250,7 @@ StdMarshalImpl_GetMarshalSizeMax(
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT WINAPI
|
static HRESULT WINAPI
|
||||||
StdMarshalImpl_MarshalInterface(
|
StdMarshalImpl_MarshalInterface(
|
||||||
LPMARSHAL iface, IStream *pStm,REFIID riid, void* pv, DWORD dwDestContext,
|
LPMARSHAL iface, IStream *pStm,REFIID riid, void* pv, DWORD dwDestContext,
|
||||||
void* pvDestContext, DWORD mshlflags
|
void* pvDestContext, DWORD mshlflags
|
||||||
|
@ -256,6 +264,7 @@ StdMarshalImpl_MarshalInterface(
|
||||||
IPSFactoryBuffer *psfacbuf;
|
IPSFactoryBuffer *psfacbuf;
|
||||||
|
|
||||||
TRACE("(...,%s,...)\n",debugstr_guid(riid));
|
TRACE("(...,%s,...)\n",debugstr_guid(riid));
|
||||||
|
|
||||||
IUnknown_QueryInterface((LPUNKNOWN)pv,&IID_IUnknown,(LPVOID*)&pUnk);
|
IUnknown_QueryInterface((LPUNKNOWN)pv,&IID_IUnknown,(LPVOID*)&pUnk);
|
||||||
mid.processid = GetCurrentProcessId();
|
mid.processid = GetCurrentProcessId();
|
||||||
mid.objectid = (DWORD)pUnk; /* FIXME */
|
mid.objectid = (DWORD)pUnk; /* FIXME */
|
||||||
|
@ -268,12 +277,14 @@ StdMarshalImpl_MarshalInterface(
|
||||||
hres = IStream_Write(pStm,&md,sizeof(md),&res);
|
hres = IStream_Write(pStm,&md,sizeof(md),&res);
|
||||||
if (hres) return hres;
|
if (hres) return hres;
|
||||||
|
|
||||||
if (SUCCEEDED(MARSHAL_Find_Stub(&mid,&pUnk))) {
|
if (SUCCEEDED(MARSHAL_Find_Stub_Buffer(&mid,&stub))) {
|
||||||
IUnknown_Release(pUnk);
|
/* Find_Stub_Buffer gives us a ref but we want to keep it, as if we'd created a new one */
|
||||||
|
TRACE("Found RpcStubBuffer %p\n", stub);
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
hres = get_facbuf_for_iid(riid,&psfacbuf);
|
hres = get_facbuf_for_iid(riid,&psfacbuf);
|
||||||
if (hres) return hres;
|
if (hres) return hres;
|
||||||
|
|
||||||
hres = IPSFactoryBuffer_CreateStub(psfacbuf,riid,pv,&stub);
|
hres = IPSFactoryBuffer_CreateStub(psfacbuf,riid,pv,&stub);
|
||||||
IPSFactoryBuffer_Release(psfacbuf);
|
IPSFactoryBuffer_Release(psfacbuf);
|
||||||
if (hres) {
|
if (hres) {
|
||||||
|
@ -286,7 +297,7 @@ StdMarshalImpl_MarshalInterface(
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT WINAPI
|
static HRESULT WINAPI
|
||||||
StdMarshalImpl_UnmarshalInterface(
|
StdMarshalImpl_UnmarshalInterface(
|
||||||
LPMARSHAL iface, IStream *pStm, REFIID riid, void **ppv
|
LPMARSHAL iface, IStream *pStm, REFIID riid, void **ppv
|
||||||
) {
|
) {
|
||||||
|
@ -307,6 +318,10 @@ StdMarshalImpl_UnmarshalInterface(
|
||||||
FIXME("Calling back to ourselves for %s!\n",debugstr_guid(riid));
|
FIXME("Calling back to ourselves for %s!\n",debugstr_guid(riid));
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
if (IsEqualIID(riid, &IID_IUnknown) || IsEqualIID(riid, &IID_NULL)) {
|
||||||
|
/* should return proxy manager IUnknown object */
|
||||||
|
FIXME("Special treatment required for IID of %s\n", debugstr_guid(riid));
|
||||||
|
}
|
||||||
hres = get_facbuf_for_iid(riid,&psfacbuf);
|
hres = get_facbuf_for_iid(riid,&psfacbuf);
|
||||||
if (hres) return hres;
|
if (hres) return hres;
|
||||||
hres = IPSFactoryBuffer_CreateProxy(psfacbuf,NULL,riid,&rpcproxy,ppv);
|
hres = IPSFactoryBuffer_CreateProxy(psfacbuf,NULL,riid,&rpcproxy,ppv);
|
||||||
|
@ -314,6 +329,9 @@ StdMarshalImpl_UnmarshalInterface(
|
||||||
FIXME("Failed to create a proxy for %s\n",debugstr_guid(riid));
|
FIXME("Failed to create a proxy for %s\n",debugstr_guid(riid));
|
||||||
return hres;
|
return hres;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
MARSHAL_Register_Proxy(&mid, (LPUNKNOWN) rpcproxy);
|
||||||
|
|
||||||
hres = PIPE_GetNewPipeBuf(&mid,&chanbuf);
|
hres = PIPE_GetNewPipeBuf(&mid,&chanbuf);
|
||||||
IPSFactoryBuffer_Release(psfacbuf);
|
IPSFactoryBuffer_Release(psfacbuf);
|
||||||
if (hres) {
|
if (hres) {
|
||||||
|
@ -332,19 +350,48 @@ StdMarshalImpl_UnmarshalInterface(
|
||||||
return hres;
|
return hres;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT WINAPI
|
static HRESULT WINAPI
|
||||||
StdMarshalImpl_ReleaseMarshalData(LPMARSHAL iface, IStream *pStm) {
|
StdMarshalImpl_ReleaseMarshalData(LPMARSHAL iface, IStream *pStm) {
|
||||||
FIXME("(), stub!\n");
|
wine_marshal_id mid;
|
||||||
|
ULONG res;
|
||||||
|
HRESULT hres;
|
||||||
|
IRpcStubBuffer *stub = NULL;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
hres = IStream_Read(pStm,&mid,sizeof(mid),&res);
|
||||||
|
if (hres) return hres;
|
||||||
|
|
||||||
|
for (i=0; i < nrofstubs; i++)
|
||||||
|
{
|
||||||
|
if (!stubs[i].valid) continue;
|
||||||
|
|
||||||
|
if (MARSHAL_Compare_Mids(&mid, &(stubs[i].mid)))
|
||||||
|
{
|
||||||
|
stub = stubs[i].stub;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!stub)
|
||||||
|
{
|
||||||
|
FIXME("Could not map MID to stub??\n");
|
||||||
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
|
res = IRpcStubBuffer_Release(stub);
|
||||||
|
stubs[i].valid = FALSE;
|
||||||
|
TRACE("stub refcount of %p is %ld\n", stub, res);
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
HRESULT WINAPI
|
static HRESULT WINAPI
|
||||||
StdMarshalImpl_DisconnectObject(LPMARSHAL iface, DWORD dwReserved) {
|
StdMarshalImpl_DisconnectObject(LPMARSHAL iface, DWORD dwReserved) {
|
||||||
FIXME("(), stub!\n");
|
FIXME("(), stub!\n");
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
ICOM_VTABLE(IMarshal) stdmvtbl = {
|
IMarshalVtbl stdmvtbl = {
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
StdMarshalImpl_QueryInterface,
|
StdMarshalImpl_QueryInterface,
|
||||||
StdMarshalImpl_AddRef,
|
StdMarshalImpl_AddRef,
|
||||||
|
@ -484,7 +531,10 @@ CoMarshalInterface( IStream *pStm, REFIID riid, IUnknown *pUnk,
|
||||||
FIXME("Stream write failed, %lx\n",hres);
|
FIXME("Stream write failed, %lx\n",hres);
|
||||||
goto release_marshal;
|
goto release_marshal;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TRACE("Calling IMarshal::MarshalInterace\n");
|
||||||
hres = IMarshal_MarshalInterface(pMarshal,pStm,riid,pUnk,dwDestContext,pvDestContext,mshlflags);
|
hres = IMarshal_MarshalInterface(pMarshal,pStm,riid,pUnk,dwDestContext,pvDestContext,mshlflags);
|
||||||
|
|
||||||
if (hres) {
|
if (hres) {
|
||||||
if (IsEqualGUID(riid,&IID_IOleObject)) {
|
if (IsEqualGUID(riid,&IID_IOleObject)) {
|
||||||
ERR("WINE currently cannot marshal IOleObject interfaces. This means you cannot embed/link OLE objects between applications.\n");
|
ERR("WINE currently cannot marshal IOleObject interfaces. This means you cannot embed/link OLE objects between applications.\n");
|
||||||
|
@ -701,7 +751,7 @@ SMCF_LockServer(LPCLASSFACTORY iface, BOOL fLock) {
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ICOM_VTABLE(IClassFactory) dfmarshalcfvtbl = {
|
static IClassFactoryVtbl dfmarshalcfvtbl = {
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
SMCF_QueryInterface,
|
SMCF_QueryInterface,
|
||||||
SMCF_AddRef,
|
SMCF_AddRef,
|
||||||
|
@ -709,7 +759,7 @@ static ICOM_VTABLE(IClassFactory) dfmarshalcfvtbl = {
|
||||||
SMCF_CreateInstance,
|
SMCF_CreateInstance,
|
||||||
SMCF_LockServer
|
SMCF_LockServer
|
||||||
};
|
};
|
||||||
static ICOM_VTABLE(IClassFactory) *pdfmarshalcfvtbl = &dfmarshalcfvtbl;
|
static IClassFactoryVtbl *pdfmarshalcfvtbl = &dfmarshalcfvtbl;
|
||||||
|
|
||||||
HRESULT
|
HRESULT
|
||||||
MARSHAL_GetStandardMarshalCF(LPVOID *ppv) {
|
MARSHAL_GetStandardMarshalCF(LPVOID *ppv) {
|
||||||
|
|
|
@ -53,7 +53,7 @@ struct HGLOBALLockBytesImpl
|
||||||
* Needs to be the first item in the stuct
|
* Needs to be the first item in the stuct
|
||||||
* since we want to cast this in an ILockBytes pointer
|
* since we want to cast this in an ILockBytes pointer
|
||||||
*/
|
*/
|
||||||
ICOM_VFIELD(ILockBytes);
|
ILockBytesVtbl *lpVtbl;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Reference count
|
* Reference count
|
||||||
|
@ -140,7 +140,7 @@ HRESULT WINAPI HGLOBALLockBytesImpl_Stat(
|
||||||
/*
|
/*
|
||||||
* Virtual function table for the HGLOBALLockBytesImpl class.
|
* Virtual function table for the HGLOBALLockBytesImpl class.
|
||||||
*/
|
*/
|
||||||
static ICOM_VTABLE(ILockBytes) HGLOBALLockBytesImpl_Vtbl =
|
static ILockBytesVtbl HGLOBALLockBytesImpl_Vtbl =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
HGLOBALLockBytesImpl_QueryInterface,
|
HGLOBALLockBytesImpl_QueryInterface,
|
||||||
|
|
|
@ -52,7 +52,7 @@ struct HGLOBALLockBytesImpl16
|
||||||
* Needs to be the first item in the stuct
|
* Needs to be the first item in the stuct
|
||||||
* since we want to cast this in an ILockBytes pointer
|
* since we want to cast this in an ILockBytes pointer
|
||||||
*/
|
*/
|
||||||
ICOM_VFIELD(ILockBytes16);
|
ILockBytes16Vtbl *lpVtbl;
|
||||||
ULONG ref;
|
ULONG ref;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -148,7 +148,7 @@ HGLOBALLockBytesImpl16_Construct(HGLOBAL16 hGlobal,
|
||||||
{
|
{
|
||||||
HGLOBALLockBytesImpl16* newLockBytes;
|
HGLOBALLockBytesImpl16* newLockBytes;
|
||||||
|
|
||||||
static ICOM_VTABLE(ILockBytes16) vt16;
|
static ILockBytes16Vtbl vt16;
|
||||||
static SEGPTR msegvt16;
|
static SEGPTR msegvt16;
|
||||||
HMODULE16 hcomp = GetModuleHandle16("OLE2");
|
HMODULE16 hcomp = GetModuleHandle16("OLE2");
|
||||||
|
|
||||||
|
@ -176,7 +176,7 @@ HGLOBALLockBytesImpl16_Construct(HGLOBAL16 hGlobal,
|
||||||
#undef VTENT
|
#undef VTENT
|
||||||
msegvt16 = MapLS( &vt16 );
|
msegvt16 = MapLS( &vt16 );
|
||||||
}
|
}
|
||||||
newLockBytes->lpVtbl = (ICOM_VTABLE(ILockBytes16)*)msegvt16;
|
newLockBytes->lpVtbl = (ILockBytes16Vtbl*)msegvt16;
|
||||||
newLockBytes->ref = 0;
|
newLockBytes->ref = 0;
|
||||||
/*
|
/*
|
||||||
* Initialize the support.
|
* Initialize the support.
|
||||||
|
|
|
@ -17,6 +17,14 @@
|
||||||
* You should have received a copy of the GNU Lesser General Public
|
* You should have received a copy of the GNU Lesser General Public
|
||||||
* License along with this library; if not, write to the Free Software
|
* License along with this library; if not, write to the Free Software
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
* TODO:
|
||||||
|
* - IRunningObjectTable should work interprocess, but currently doesn't.
|
||||||
|
* Native (on Win2k at least) uses an undocumented RPC interface, IROT, to
|
||||||
|
* communicate with RPCSS which contains the table of marshalled data.
|
||||||
|
* - IRunningObjectTable should use marshalling instead of simple ref
|
||||||
|
* counting as there is the possibility of using the running object table
|
||||||
|
* to access objects in other apartments.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <assert.h>
|
#include <assert.h>
|
||||||
|
@ -50,7 +58,7 @@ typedef struct RunObject{
|
||||||
/* define the RunningObjectTableImpl structure */
|
/* define the RunningObjectTableImpl structure */
|
||||||
typedef struct RunningObjectTableImpl{
|
typedef struct RunningObjectTableImpl{
|
||||||
|
|
||||||
ICOM_VFIELD(IRunningObjectTable);
|
IRunningObjectTableVtbl *lpVtbl;
|
||||||
ULONG ref;
|
ULONG ref;
|
||||||
|
|
||||||
RunObject* runObjTab; /* pointer to the first object in the table */
|
RunObject* runObjTab; /* pointer to the first object in the table */
|
||||||
|
@ -82,7 +90,7 @@ HRESULT WINAPI RunningObjectTableImpl_Destroy();
|
||||||
HRESULT WINAPI RunningObjectTableImpl_GetObjectIndex(RunningObjectTableImpl* This,DWORD identReg,IMoniker* pmk,DWORD *indx);
|
HRESULT WINAPI RunningObjectTableImpl_GetObjectIndex(RunningObjectTableImpl* This,DWORD identReg,IMoniker* pmk,DWORD *indx);
|
||||||
|
|
||||||
/* Virtual function table for the IRunningObjectTable class. */
|
/* Virtual function table for the IRunningObjectTable class. */
|
||||||
static ICOM_VTABLE(IRunningObjectTable) VT_RunningObjectTableImpl =
|
static IRunningObjectTableVtbl VT_RunningObjectTableImpl =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
RunningObjectTableImpl_QueryInterface,
|
RunningObjectTableImpl_QueryInterface,
|
||||||
|
@ -302,9 +310,12 @@ HRESULT WINAPI RunningObjectTableImpl_Register(IRunningObjectTable* iface,
|
||||||
return E_OUTOFMEMORY;
|
return E_OUTOFMEMORY;
|
||||||
}
|
}
|
||||||
/* add a reference to the object in the strong registration case */
|
/* add a reference to the object in the strong registration case */
|
||||||
if ((grfFlags & ROTFLAGS_REGISTRATIONKEEPSALIVE) !=0 )
|
if ((grfFlags & ROTFLAGS_REGISTRATIONKEEPSALIVE) !=0 ) {
|
||||||
|
TRACE("strong registration, reffing %p\n", punkObject);
|
||||||
|
/* this is wrong; we should always add a reference to the object */
|
||||||
IUnknown_AddRef(punkObject);
|
IUnknown_AddRef(punkObject);
|
||||||
|
}
|
||||||
|
|
||||||
IMoniker_AddRef(pmkObjectName);
|
IMoniker_AddRef(pmkObjectName);
|
||||||
|
|
||||||
return res;
|
return res;
|
||||||
|
@ -328,9 +339,12 @@ HRESULT WINAPI RunningObjectTableImpl_Revoke( IRunningObjectTable* iface,
|
||||||
return E_INVALIDARG;
|
return E_INVALIDARG;
|
||||||
|
|
||||||
/* release the object if it was registered with a strong registrantion option */
|
/* release the object if it was registered with a strong registrantion option */
|
||||||
if ((This->runObjTab[index].regTypeObj & ROTFLAGS_REGISTRATIONKEEPSALIVE)!=0)
|
if ((This->runObjTab[index].regTypeObj & ROTFLAGS_REGISTRATIONKEEPSALIVE)!=0) {
|
||||||
|
TRACE("releasing %p\n", This->runObjTab[index].pObj);
|
||||||
|
/* this is also wrong; we should always release the object (see above) */
|
||||||
IUnknown_Release(This->runObjTab[index].pObj);
|
IUnknown_Release(This->runObjTab[index].pObj);
|
||||||
|
}
|
||||||
|
|
||||||
IMoniker_Release(This->runObjTab[index].pmkObj);
|
IMoniker_Release(This->runObjTab[index].pmkObj);
|
||||||
|
|
||||||
/* remove the object from the table */
|
/* remove the object from the table */
|
||||||
|
@ -373,8 +387,10 @@ HRESULT WINAPI RunningObjectTableImpl_GetObject( IRunningObjectTable* iface,
|
||||||
*ppunkObject=0;
|
*ppunkObject=0;
|
||||||
|
|
||||||
/* verify if the object was registered before or not */
|
/* verify if the object was registered before or not */
|
||||||
if (RunningObjectTableImpl_GetObjectIndex(This,-1,pmkObjectName,&index)==S_FALSE)
|
if (RunningObjectTableImpl_GetObjectIndex(This,-1,pmkObjectName,&index)==S_FALSE) {
|
||||||
|
WARN("Moniker unavailable - needs to work interprocess?\n");
|
||||||
return MK_E_UNAVAILABLE;
|
return MK_E_UNAVAILABLE;
|
||||||
|
}
|
||||||
|
|
||||||
/* add a reference to the object then set output object argument */
|
/* add a reference to the object then set output object argument */
|
||||||
IUnknown_AddRef(This->runObjTab[index].pObj);
|
IUnknown_AddRef(This->runObjTab[index].pObj);
|
||||||
|
|
|
@ -64,7 +64,7 @@ LPMALLOC16 currentMalloc16=NULL;
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
/* IUnknown fields */
|
/* IUnknown fields */
|
||||||
ICOM_VFIELD(IMalloc16);
|
IMalloc16Vtbl *lpVtbl;
|
||||||
DWORD ref;
|
DWORD ref;
|
||||||
/* IMalloc16 fields */
|
/* IMalloc16 fields */
|
||||||
} IMalloc16Impl;
|
} IMalloc16Impl;
|
||||||
|
@ -178,7 +178,7 @@ LPVOID WINAPI IMalloc16_fnHeapMinimize(IMalloc16* iface) {
|
||||||
LPMALLOC16
|
LPMALLOC16
|
||||||
IMalloc16_Constructor()
|
IMalloc16_Constructor()
|
||||||
{
|
{
|
||||||
static ICOM_VTABLE(IMalloc16) vt16;
|
static IMalloc16Vtbl vt16;
|
||||||
static SEGPTR msegvt16;
|
static SEGPTR msegvt16;
|
||||||
IMalloc16Impl* This;
|
IMalloc16Impl* This;
|
||||||
HMODULE16 hcomp = GetModuleHandle16("COMPOBJ");
|
HMODULE16 hcomp = GetModuleHandle16("COMPOBJ");
|
||||||
|
@ -199,7 +199,7 @@ IMalloc16_Constructor()
|
||||||
#undef VTENT
|
#undef VTENT
|
||||||
msegvt16 = MapLS( &vt16 );
|
msegvt16 = MapLS( &vt16 );
|
||||||
}
|
}
|
||||||
This->lpVtbl = (ICOM_VTABLE(IMalloc16)*)msegvt16;
|
This->lpVtbl = (IMalloc16Vtbl*)msegvt16;
|
||||||
This->ref = 1;
|
This->ref = 1;
|
||||||
return (LPMALLOC16)MapLS( This );
|
return (LPMALLOC16)MapLS( This );
|
||||||
}
|
}
|
||||||
|
@ -313,7 +313,7 @@ _xmalloc16(DWORD size, SEGPTR *ptr) {
|
||||||
* everything we need.
|
* everything we need.
|
||||||
*/
|
*/
|
||||||
if (!K32WOWCallback16Ex(
|
if (!K32WOWCallback16Ex(
|
||||||
(DWORD)((ICOM_VTABLE(IMalloc16)*)MapSL(
|
(DWORD)((IMalloc16Vtbl*)MapSL(
|
||||||
(SEGPTR)((LPMALLOC16)MapSL((SEGPTR)mllc))->lpVtbl )
|
(SEGPTR)((LPMALLOC16)MapSL((SEGPTR)mllc))->lpVtbl )
|
||||||
)->Alloc,
|
)->Alloc,
|
||||||
WCB16_CDECL,
|
WCB16_CDECL,
|
||||||
|
|
|
@ -38,7 +38,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(ole);
|
||||||
*/
|
*/
|
||||||
typedef struct OleAdviseHolderImpl
|
typedef struct OleAdviseHolderImpl
|
||||||
{
|
{
|
||||||
ICOM_VFIELD(IOleAdviseHolder);
|
IOleAdviseHolderVtbl *lpVtbl;
|
||||||
|
|
||||||
DWORD ref;
|
DWORD ref;
|
||||||
|
|
||||||
|
@ -63,7 +63,7 @@ static HRESULT WINAPI OleAdviseHolderImpl_SendOnClose (LPOLEADVISEHOLDER);
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* OleAdviseHolderImpl_VTable
|
* OleAdviseHolderImpl_VTable
|
||||||
*/
|
*/
|
||||||
static struct ICOM_VTABLE(IOleAdviseHolder) oahvt =
|
static struct IOleAdviseHolderVtbl oahvt =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
OleAdviseHolderImpl_QueryInterface,
|
OleAdviseHolderImpl_QueryInterface,
|
||||||
|
@ -369,7 +369,7 @@ typedef struct DataAdviseConnection {
|
||||||
|
|
||||||
typedef struct DataAdviseHolder
|
typedef struct DataAdviseHolder
|
||||||
{
|
{
|
||||||
ICOM_VFIELD(IDataAdviseHolder);
|
IDataAdviseHolderVtbl *lpVtbl;
|
||||||
|
|
||||||
DWORD ref;
|
DWORD ref;
|
||||||
DWORD maxCons;
|
DWORD maxCons;
|
||||||
|
@ -411,7 +411,7 @@ static HRESULT WINAPI DataAdviseHolder_SendOnDataChange(
|
||||||
/**************************************************************************
|
/**************************************************************************
|
||||||
* DataAdviseHolderImpl_VTable
|
* DataAdviseHolderImpl_VTable
|
||||||
*/
|
*/
|
||||||
static struct ICOM_VTABLE(IDataAdviseHolder) DataAdviseHolderImpl_VTable =
|
static struct IDataAdviseHolderVtbl DataAdviseHolderImpl_VTable =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
DataAdviseHolder_QueryInterface,
|
DataAdviseHolder_QueryInterface,
|
||||||
|
|
|
@ -19,15 +19,18 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Documentation on MSDN:
|
/* Documentation on MSDN:
|
||||||
|
*
|
||||||
|
* (Top level COM documentation)
|
||||||
|
* http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnanchor/html/componentdevelopmentank.asp
|
||||||
*
|
*
|
||||||
* (COM Proxy)
|
* (COM Proxy)
|
||||||
* http://msdn.microsoft.com/library/en-us/com/comext_1q0p.asp
|
* http://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/htm/comext_1q0p.asp
|
||||||
*
|
*
|
||||||
* (COM Stub)
|
* (COM Stub)
|
||||||
* http://msdn.microsoft.com/library/en-us/com/comext_1lia.asp
|
* http://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/htm/comext_1lia.asp
|
||||||
*
|
*
|
||||||
* (Marshal)
|
* (Marshal)
|
||||||
* http://msdn.microsoft.com/library/en-us/com/comext_1gfn.asp
|
* http://msdn.microsoft.com/library/default.asp?url=/library/en-us/com/htm/comext_1gfn.asp
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
@ -81,7 +84,7 @@ const CLSID CLSID_PSFactoryBuffer = { 0x00000320, 0, 0, {0xc0, 0, 0, 0, 0, 0, 0,
|
||||||
* COM will load the appropriate interface stubs and proxies as needed.
|
* COM will load the appropriate interface stubs and proxies as needed.
|
||||||
*/
|
*/
|
||||||
typedef struct _CFStub {
|
typedef struct _CFStub {
|
||||||
ICOM_VTABLE(IRpcStubBuffer) *lpvtbl;
|
IRpcStubBufferVtbl *lpvtbl;
|
||||||
DWORD ref;
|
DWORD ref;
|
||||||
|
|
||||||
LPUNKNOWN pUnkServer;
|
LPUNKNOWN pUnkServer;
|
||||||
|
@ -234,7 +237,7 @@ CFStub_DebugServerRelease(LPRPCSTUBBUFFER iface,void *pv) {
|
||||||
FIXME("(%p), stub!\n",pv);
|
FIXME("(%p), stub!\n",pv);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ICOM_VTABLE(IRpcStubBuffer) cfstubvt = {
|
static IRpcStubBufferVtbl cfstubvt = {
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
CFStub_QueryInterface,
|
CFStub_QueryInterface,
|
||||||
CFStub_AddRef,
|
CFStub_AddRef,
|
||||||
|
@ -265,8 +268,8 @@ CFStub_Construct(LPRPCSTUBBUFFER *ppv) {
|
||||||
* the refcount.
|
* the refcount.
|
||||||
*/
|
*/
|
||||||
typedef struct _CFProxy {
|
typedef struct _CFProxy {
|
||||||
ICOM_VTABLE(IClassFactory) *lpvtbl_cf;
|
IClassFactoryVtbl *lpvtbl_cf;
|
||||||
ICOM_VTABLE(IRpcProxyBuffer) *lpvtbl_proxy;
|
IRpcProxyBufferVtbl *lpvtbl_proxy;
|
||||||
DWORD ref;
|
DWORD ref;
|
||||||
|
|
||||||
IRpcChannelBuffer *chanbuf;
|
IRpcChannelBuffer *chanbuf;
|
||||||
|
@ -409,7 +412,7 @@ static HRESULT WINAPI CFProxy_LockServer(LPCLASSFACTORY iface,BOOL fLock) {
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ICOM_VTABLE(IRpcProxyBuffer) pspbvtbl = {
|
static IRpcProxyBufferVtbl pspbvtbl = {
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
IRpcProxyBufferImpl_QueryInterface,
|
IRpcProxyBufferImpl_QueryInterface,
|
||||||
IRpcProxyBufferImpl_AddRef,
|
IRpcProxyBufferImpl_AddRef,
|
||||||
|
@ -417,7 +420,7 @@ static ICOM_VTABLE(IRpcProxyBuffer) pspbvtbl = {
|
||||||
IRpcProxyBufferImpl_Connect,
|
IRpcProxyBufferImpl_Connect,
|
||||||
IRpcProxyBufferImpl_Disconnect
|
IRpcProxyBufferImpl_Disconnect
|
||||||
};
|
};
|
||||||
static ICOM_VTABLE(IClassFactory) cfproxyvt = {
|
static IClassFactoryVtbl cfproxyvt = {
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
CFProxy_QueryInterface,
|
CFProxy_QueryInterface,
|
||||||
CFProxy_AddRef,
|
CFProxy_AddRef,
|
||||||
|
@ -493,7 +496,7 @@ PSFacBuf_CreateStub(
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ICOM_VTABLE(IPSFactoryBuffer) psfacbufvtbl = {
|
static IPSFactoryBufferVtbl psfacbufvtbl = {
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
PSFacBuf_QueryInterface,
|
PSFacBuf_QueryInterface,
|
||||||
PSFacBuf_AddRef,
|
PSFacBuf_AddRef,
|
||||||
|
@ -503,7 +506,7 @@ static ICOM_VTABLE(IPSFactoryBuffer) psfacbufvtbl = {
|
||||||
};
|
};
|
||||||
|
|
||||||
/* This is the whole PSFactoryBuffer object, just the vtableptr */
|
/* This is the whole PSFactoryBuffer object, just the vtableptr */
|
||||||
static ICOM_VTABLE(IPSFactoryBuffer) *lppsfac = &psfacbufvtbl;
|
static IPSFactoryBufferVtbl *lppsfac = &psfacbufvtbl;
|
||||||
|
|
||||||
/***********************************************************************
|
/***********************************************************************
|
||||||
* DllGetClassObject [OLE32.@]
|
* DllGetClassObject [OLE32.@]
|
||||||
|
@ -513,10 +516,6 @@ HRESULT WINAPI OLE32_DllGetClassObject(REFCLSID rclsid, REFIID iid,LPVOID *ppv)
|
||||||
*ppv = NULL;
|
*ppv = NULL;
|
||||||
if (IsEqualIID(rclsid,&CLSID_PSFactoryBuffer)) {
|
if (IsEqualIID(rclsid,&CLSID_PSFactoryBuffer)) {
|
||||||
*ppv = &lppsfac;
|
*ppv = &lppsfac;
|
||||||
/* If we create a ps factory, we might need a stub manager later
|
|
||||||
* anyway
|
|
||||||
*/
|
|
||||||
STUBMGR_Start();
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
if (IsEqualIID(rclsid,&CLSID_DfMarshal)&&(
|
if (IsEqualIID(rclsid,&CLSID_DfMarshal)&&(
|
||||||
|
|
|
@ -50,6 +50,38 @@
|
||||||
|
|
||||||
WINE_DEFAULT_DEBUG_CHANNEL(ole);
|
WINE_DEFAULT_DEBUG_CHANNEL(ole);
|
||||||
|
|
||||||
|
#define REQTYPE_REQUEST 0
|
||||||
|
typedef struct _wine_rpc_request_header {
|
||||||
|
DWORD reqid;
|
||||||
|
wine_marshal_id mid;
|
||||||
|
DWORD iMethod;
|
||||||
|
DWORD cbBuffer;
|
||||||
|
} wine_rpc_request_header;
|
||||||
|
|
||||||
|
#define REQTYPE_RESPONSE 1
|
||||||
|
typedef struct _wine_rpc_response_header {
|
||||||
|
DWORD reqid;
|
||||||
|
DWORD cbBuffer;
|
||||||
|
DWORD retval;
|
||||||
|
} wine_rpc_response_header;
|
||||||
|
|
||||||
|
/* used when shutting down a pipe, e.g. at the end of a process */
|
||||||
|
#define REQTYPE_DISCONNECT 2
|
||||||
|
typedef struct _wine_rpc_disconnect_header {
|
||||||
|
DWORD reqid;
|
||||||
|
wine_marshal_id mid; /* mid of stub to delete */
|
||||||
|
} wine_rpc_disconnect_header;
|
||||||
|
|
||||||
|
|
||||||
|
#define REQSTATE_START 0
|
||||||
|
#define REQSTATE_REQ_QUEUED 1
|
||||||
|
#define REQSTATE_REQ_WAITING_FOR_REPLY 2
|
||||||
|
#define REQSTATE_REQ_GOT 3
|
||||||
|
#define REQSTATE_INVOKING 4
|
||||||
|
#define REQSTATE_RESP_QUEUED 5
|
||||||
|
#define REQSTATE_RESP_GOT 6
|
||||||
|
#define REQSTATE_DONE 6
|
||||||
|
|
||||||
typedef struct _wine_rpc_request {
|
typedef struct _wine_rpc_request {
|
||||||
int state;
|
int state;
|
||||||
HANDLE hPipe; /* temp copy of handle */
|
HANDLE hPipe; /* temp copy of handle */
|
||||||
|
@ -61,10 +93,11 @@ typedef struct _wine_rpc_request {
|
||||||
static wine_rpc_request **reqs = NULL;
|
static wine_rpc_request **reqs = NULL;
|
||||||
static int nrofreqs = 0;
|
static int nrofreqs = 0;
|
||||||
|
|
||||||
/* This pipe is _thread_ based */
|
/* This pipe is _thread_ based, each thread which talks to a remote
|
||||||
|
* apartment (mid) has its own pipe */
|
||||||
typedef struct _wine_pipe {
|
typedef struct _wine_pipe {
|
||||||
wine_marshal_id mid; /* target mid */
|
wine_marshal_id mid; /* target mid */
|
||||||
DWORD tid; /* thread in which we execute */
|
DWORD tid; /* thread which owns this outgoing pipe */
|
||||||
HANDLE hPipe;
|
HANDLE hPipe;
|
||||||
|
|
||||||
int pending;
|
int pending;
|
||||||
|
@ -76,7 +109,7 @@ static wine_pipe *pipes = NULL;
|
||||||
static int nrofpipes = 0;
|
static int nrofpipes = 0;
|
||||||
|
|
||||||
typedef struct _PipeBuf {
|
typedef struct _PipeBuf {
|
||||||
ICOM_VTABLE(IRpcChannelBuffer) *lpVtbl;
|
IRpcChannelBufferVtbl *lpVtbl;
|
||||||
DWORD ref;
|
DWORD ref;
|
||||||
|
|
||||||
wine_marshal_id mid;
|
wine_marshal_id mid;
|
||||||
|
@ -84,7 +117,7 @@ typedef struct _PipeBuf {
|
||||||
} PipeBuf;
|
} PipeBuf;
|
||||||
|
|
||||||
static HRESULT WINAPI
|
static HRESULT WINAPI
|
||||||
_xread(HANDLE hf, LPVOID ptr, DWORD size) {
|
read_pipe(HANDLE hf, LPVOID ptr, DWORD size) {
|
||||||
DWORD res;
|
DWORD res;
|
||||||
if (!ReadFile(hf,ptr,size,&res,NULL)) {
|
if (!ReadFile(hf,ptr,size,&res,NULL)) {
|
||||||
FIXME("Failed to read from %p, le is %lx\n",hf,GetLastError());
|
FIXME("Failed to read from %p, le is %lx\n",hf,GetLastError());
|
||||||
|
@ -124,7 +157,7 @@ drs(LPCSTR where) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT WINAPI
|
static HRESULT WINAPI
|
||||||
_xwrite(HANDLE hf, LPVOID ptr, DWORD size) {
|
write_pipe(HANDLE hf, LPVOID ptr, DWORD size) {
|
||||||
DWORD res;
|
DWORD res;
|
||||||
if (!WriteFile(hf,ptr,size,&res,NULL)) {
|
if (!WriteFile(hf,ptr,size,&res,NULL)) {
|
||||||
FIXME("Failed to write to %p, le is %lx\n",hf,GetLastError());
|
FIXME("Failed to write to %p, le is %lx\n",hf,GetLastError());
|
||||||
|
@ -260,10 +293,25 @@ PipeBuf_AddRef(LPRPCCHANNELBUFFER iface) {
|
||||||
static ULONG WINAPI
|
static ULONG WINAPI
|
||||||
PipeBuf_Release(LPRPCCHANNELBUFFER iface) {
|
PipeBuf_Release(LPRPCCHANNELBUFFER iface) {
|
||||||
ICOM_THIS(PipeBuf,iface);
|
ICOM_THIS(PipeBuf,iface);
|
||||||
|
wine_rpc_disconnect_header header;
|
||||||
|
HANDLE pipe;
|
||||||
|
DWORD reqtype = REQTYPE_DISCONNECT;
|
||||||
|
|
||||||
This->ref--;
|
This->ref--;
|
||||||
if (This->ref)
|
if (This->ref)
|
||||||
return This->ref;
|
return This->ref;
|
||||||
ERR("Free all stuff.\n");
|
|
||||||
|
FIXME("Free all stuff\n");
|
||||||
|
|
||||||
|
memcpy(&header.mid, &This->mid, sizeof(wine_marshal_id));
|
||||||
|
|
||||||
|
pipe = PIPE_FindByMID(&This->mid);
|
||||||
|
|
||||||
|
write_pipe(pipe, &reqtype, sizeof(reqtype));
|
||||||
|
write_pipe(pipe, &header, sizeof(wine_rpc_disconnect_header));
|
||||||
|
|
||||||
|
TRACE("written disconnect packet\n");
|
||||||
|
|
||||||
HeapFree(GetProcessHeap(),0,This);
|
HeapFree(GetProcessHeap(),0,This);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -274,7 +322,7 @@ PipeBuf_GetBuffer(
|
||||||
) {
|
) {
|
||||||
/*ICOM_THIS(PipeBuf,iface);*/
|
/*ICOM_THIS(PipeBuf,iface);*/
|
||||||
|
|
||||||
TRACE("(%p,%s), slightly wrong.\n",msg,debugstr_guid(riid));
|
TRACE("(%p,%s)\n",msg,debugstr_guid(riid));
|
||||||
/* probably reuses IID in real. */
|
/* probably reuses IID in real. */
|
||||||
if (msg->cbBuffer && (msg->Buffer == NULL))
|
if (msg->cbBuffer && (msg->Buffer == NULL))
|
||||||
msg->Buffer = HeapAlloc(GetProcessHeap(),0,msg->cbBuffer);
|
msg->Buffer = HeapAlloc(GetProcessHeap(),0,msg->cbBuffer);
|
||||||
|
@ -282,7 +330,7 @@ PipeBuf_GetBuffer(
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT
|
static HRESULT
|
||||||
_invoke_onereq(wine_rpc_request *req) {
|
COM_InvokeAndRpcSend(wine_rpc_request *req) {
|
||||||
IRpcStubBuffer *stub;
|
IRpcStubBuffer *stub;
|
||||||
RPCOLEMESSAGE msg;
|
RPCOLEMESSAGE msg;
|
||||||
HRESULT hres;
|
HRESULT hres;
|
||||||
|
@ -296,23 +344,25 @@ _invoke_onereq(wine_rpc_request *req) {
|
||||||
msg.Buffer = req->Buffer;
|
msg.Buffer = req->Buffer;
|
||||||
msg.iMethod = req->reqh.iMethod;
|
msg.iMethod = req->reqh.iMethod;
|
||||||
msg.cbBuffer = req->reqh.cbBuffer;
|
msg.cbBuffer = req->reqh.cbBuffer;
|
||||||
|
msg.dataRepresentation = NDR_LOCAL_DATA_REPRESENTATION;
|
||||||
req->state = REQSTATE_INVOKING;
|
req->state = REQSTATE_INVOKING;
|
||||||
req->resph.retval = IRpcStubBuffer_Invoke(stub,&msg,NULL);
|
req->resph.retval = IRpcStubBuffer_Invoke(stub,&msg,NULL);
|
||||||
|
IUnknown_Release(stub);
|
||||||
req->Buffer = msg.Buffer;
|
req->Buffer = msg.Buffer;
|
||||||
req->resph.cbBuffer = msg.cbBuffer;
|
req->resph.cbBuffer = msg.cbBuffer;
|
||||||
reqtype = REQTYPE_RESPONSE;
|
reqtype = REQTYPE_RESPONSE;
|
||||||
hres = _xwrite(req->hPipe,&reqtype,sizeof(reqtype));
|
hres = write_pipe(req->hPipe,&reqtype,sizeof(reqtype));
|
||||||
if (hres) return hres;
|
if (hres) return hres;
|
||||||
hres = _xwrite(req->hPipe,&(req->resph),sizeof(req->resph));
|
hres = write_pipe(req->hPipe,&(req->resph),sizeof(req->resph));
|
||||||
if (hres) return hres;
|
if (hres) return hres;
|
||||||
hres = _xwrite(req->hPipe,req->Buffer,req->resph.cbBuffer);
|
hres = write_pipe(req->hPipe,req->Buffer,req->resph.cbBuffer);
|
||||||
if (hres) return hres;
|
if (hres) return hres;
|
||||||
req->state = REQSTATE_DONE;
|
req->state = REQSTATE_DONE;
|
||||||
drs("invoke");
|
drs("invoke");
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT _read_one(wine_pipe *xpipe);
|
static HRESULT COM_RpcReceive(wine_pipe *xpipe);
|
||||||
|
|
||||||
static HRESULT
|
static HRESULT
|
||||||
RPC_QueueRequestAndWait(wine_rpc_request *req) {
|
RPC_QueueRequestAndWait(wine_rpc_request *req) {
|
||||||
|
@ -333,27 +383,31 @@ RPC_QueueRequestAndWait(wine_rpc_request *req) {
|
||||||
req->hPipe = xpipe->hPipe;
|
req->hPipe = xpipe->hPipe;
|
||||||
req->state = REQSTATE_REQ_WAITING_FOR_REPLY;
|
req->state = REQSTATE_REQ_WAITING_FOR_REPLY;
|
||||||
reqtype = REQTYPE_REQUEST;
|
reqtype = REQTYPE_REQUEST;
|
||||||
hres = _xwrite(req->hPipe,&reqtype,sizeof(reqtype));
|
hres = write_pipe(req->hPipe,&reqtype,sizeof(reqtype));
|
||||||
if (hres) return hres;
|
if (hres) return hres;
|
||||||
hres = _xwrite(req->hPipe,&(req->reqh),sizeof(req->reqh));
|
hres = write_pipe(req->hPipe,&(req->reqh),sizeof(req->reqh));
|
||||||
if (hres) return hres;
|
if (hres) return hres;
|
||||||
hres = _xwrite(req->hPipe,req->Buffer,req->reqh.cbBuffer);
|
hres = write_pipe(req->hPipe,req->Buffer,req->reqh.cbBuffer);
|
||||||
if (hres) return hres;
|
if (hres) return hres;
|
||||||
|
|
||||||
while (1) {
|
/* This loop is about allowing re-entrancy. While waiting for the
|
||||||
/*WaitForSingleObject(hRpcChanged,INFINITE);*/
|
* response to one RPC we may receive a request starting another. */
|
||||||
hres = _read_one(xpipe);
|
while (!hres) {
|
||||||
|
hres = COM_RpcReceive(xpipe);
|
||||||
if (hres) break;
|
if (hres) break;
|
||||||
|
|
||||||
for (i=0;i<nrofreqs;i++) {
|
for (i=0;i<nrofreqs;i++) {
|
||||||
xreq = reqs[i];
|
xreq = reqs[i];
|
||||||
if ((xreq->state==REQSTATE_REQ_GOT) && (xreq->hPipe==req->hPipe)) {
|
if ((xreq->state==REQSTATE_REQ_GOT) && (xreq->hPipe==req->hPipe)) {
|
||||||
_invoke_onereq(xreq);
|
hres = COM_InvokeAndRpcSend(xreq);
|
||||||
|
if (hres) break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (req->state == REQSTATE_RESP_GOT)
|
if (req->state == REQSTATE_RESP_GOT)
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
if (FAILED(hres))
|
||||||
|
WARN("-- 0x%08lx\n", hres);
|
||||||
return hres;
|
return hres;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -411,7 +465,7 @@ PipeBuf_IsConnected(LPRPCCHANNELBUFFER iface) {
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ICOM_VTABLE(IRpcChannelBuffer) pipebufvt = {
|
static IRpcChannelBufferVtbl pipebufvt = {
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
PipeBuf_QueryInterface,
|
PipeBuf_QueryInterface,
|
||||||
PipeBuf_AddRef,
|
PipeBuf_AddRef,
|
||||||
|
@ -467,12 +521,14 @@ PIPE_GetNewPipeBuf(wine_marshal_id *mid, IRpcChannelBuffer **pipebuf) {
|
||||||
|
|
||||||
static HRESULT
|
static HRESULT
|
||||||
create_server(REFCLSID rclsid) {
|
create_server(REFCLSID rclsid) {
|
||||||
|
static const WCHAR embedding[] = { ' ', '-','E','m','b','e','d','d','i','n','g',0 };
|
||||||
HKEY key;
|
HKEY key;
|
||||||
char buf[200];
|
char buf[200];
|
||||||
HRESULT hres = E_UNEXPECTED;
|
HRESULT hres = E_UNEXPECTED;
|
||||||
char xclsid[80];
|
char xclsid[80];
|
||||||
WCHAR dllName[MAX_PATH+1];
|
WCHAR exe[MAX_PATH+1];
|
||||||
DWORD dllNameLen = sizeof(dllName);
|
DWORD exelen = sizeof(exe);
|
||||||
|
WCHAR command[MAX_PATH+sizeof(embedding)/sizeof(WCHAR)];
|
||||||
STARTUPINFOW sinfo;
|
STARTUPINFOW sinfo;
|
||||||
PROCESS_INFORMATION pinfo;
|
PROCESS_INFORMATION pinfo;
|
||||||
|
|
||||||
|
@ -481,18 +537,35 @@ create_server(REFCLSID rclsid) {
|
||||||
sprintf(buf,"CLSID\\%s\\LocalServer32",xclsid);
|
sprintf(buf,"CLSID\\%s\\LocalServer32",xclsid);
|
||||||
hres = RegOpenKeyExA(HKEY_CLASSES_ROOT, buf, 0, KEY_READ, &key);
|
hres = RegOpenKeyExA(HKEY_CLASSES_ROOT, buf, 0, KEY_READ, &key);
|
||||||
|
|
||||||
if (hres != ERROR_SUCCESS)
|
if (hres != ERROR_SUCCESS) {
|
||||||
|
WARN("CLSID %s not registered as LocalServer32\n", xclsid);
|
||||||
return REGDB_E_READREGDB; /* Probably */
|
return REGDB_E_READREGDB; /* Probably */
|
||||||
|
}
|
||||||
|
|
||||||
memset(dllName,0,sizeof(dllName));
|
memset(exe,0,sizeof(exe));
|
||||||
hres= RegQueryValueExW(key,NULL,NULL,NULL,(LPBYTE)dllName,&dllNameLen);
|
hres= RegQueryValueExW(key, NULL, NULL, NULL, (LPBYTE)exe, &exelen);
|
||||||
RegCloseKey(key);
|
RegCloseKey(key);
|
||||||
if (hres)
|
if (hres) {
|
||||||
return REGDB_E_CLASSNOTREG; /* FIXME: check retval */
|
WARN("No default value for LocalServer32 key\n");
|
||||||
|
return REGDB_E_CLASSNOTREG; /* FIXME: check retval */
|
||||||
|
}
|
||||||
|
|
||||||
memset(&sinfo,0,sizeof(sinfo));
|
memset(&sinfo,0,sizeof(sinfo));
|
||||||
sinfo.cb = sizeof(sinfo);
|
sinfo.cb = sizeof(sinfo);
|
||||||
if (!CreateProcessW(NULL,dllName,NULL,NULL,FALSE,0,NULL,NULL,&sinfo,&pinfo))
|
|
||||||
|
/* EXE servers are started with the -Embedding switch. MSDN also claims /Embedding is used,
|
||||||
|
9x does -Embedding, perhaps an 9x/NT difference? */
|
||||||
|
|
||||||
|
strcpyW(command, exe);
|
||||||
|
strcatW(command, embedding);
|
||||||
|
|
||||||
|
TRACE("activating local server '%s' for %s\n", debugstr_w(command), xclsid);
|
||||||
|
|
||||||
|
if (!CreateProcessW(exe, command, NULL, NULL, FALSE, 0, NULL, NULL, &sinfo, &pinfo)) {
|
||||||
|
WARN("failed to run local server %s\n", debugstr_w(exe));
|
||||||
return E_FAIL;
|
return E_FAIL;
|
||||||
|
}
|
||||||
|
|
||||||
return S_OK;
|
return S_OK;
|
||||||
}
|
}
|
||||||
/* http://msdn.microsoft.com/library/en-us/dnmsj99/html/com0199.asp, Figure 4 */
|
/* http://msdn.microsoft.com/library/en-us/dnmsj99/html/com0199.asp, Figure 4 */
|
||||||
|
@ -508,6 +581,8 @@ HRESULT create_marshalled_proxy(REFCLSID rclsid, REFIID iid, LPVOID *ppv) {
|
||||||
int tries = 0;
|
int tries = 0;
|
||||||
#define MAXTRIES 10000
|
#define MAXTRIES 10000
|
||||||
|
|
||||||
|
TRACE("rclsid=%s, iid=%s\n", debugstr_guid(rclsid), debugstr_guid(iid));
|
||||||
|
|
||||||
strcpy(pipefn,PIPEPREF);
|
strcpy(pipefn,PIPEPREF);
|
||||||
WINE_StringFromCLSID(rclsid,pipefn+strlen(PIPEPREF));
|
WINE_StringFromCLSID(rclsid,pipefn+strlen(PIPEPREF));
|
||||||
|
|
||||||
|
@ -562,7 +637,7 @@ PIPE_StartRequestThread(HANDLE xhPipe) {
|
||||||
wine_marshal_id remoteid;
|
wine_marshal_id remoteid;
|
||||||
HRESULT hres;
|
HRESULT hres;
|
||||||
|
|
||||||
hres = _xread(xhPipe,&remoteid,sizeof(remoteid));
|
hres = read_pipe(xhPipe,&remoteid,sizeof(remoteid));
|
||||||
if (hres) {
|
if (hres) {
|
||||||
ERR("Failed to read remote mid!\n");
|
ERR("Failed to read remote mid!\n");
|
||||||
return;
|
return;
|
||||||
|
@ -571,35 +646,62 @@ PIPE_StartRequestThread(HANDLE xhPipe) {
|
||||||
}
|
}
|
||||||
|
|
||||||
static HRESULT
|
static HRESULT
|
||||||
_read_one(wine_pipe *xpipe) {
|
COM_RpcReceive(wine_pipe *xpipe) {
|
||||||
DWORD reqtype;
|
DWORD reqtype;
|
||||||
HRESULT hres = S_OK;
|
HRESULT hres = S_OK;
|
||||||
HANDLE xhPipe = xpipe->hPipe;
|
HANDLE xhPipe = xpipe->hPipe;
|
||||||
|
|
||||||
/*FIXME("%lx %d reading reqtype\n",GetCurrentProcessId(),xhPipe);*/
|
/*FIXME("%lx %d reading reqtype\n",GetCurrentProcessId(),xhPipe);*/
|
||||||
hres = _xread(xhPipe,&reqtype,sizeof(reqtype));
|
hres = read_pipe(xhPipe,&reqtype,sizeof(reqtype));
|
||||||
if (hres) goto end;
|
if (hres) goto end;
|
||||||
EnterCriticalSection(&(xpipe->crit));
|
EnterCriticalSection(&(xpipe->crit));
|
||||||
/*FIXME("%lx got reqtype %ld\n",GetCurrentProcessId(),reqtype);*/
|
/*FIXME("%lx got reqtype %ld\n",GetCurrentProcessId(),reqtype);*/
|
||||||
|
|
||||||
if (reqtype == REQTYPE_REQUEST) {
|
if (reqtype == REQTYPE_DISCONNECT) { /* only received by servers */
|
||||||
|
wine_rpc_disconnect_header header;
|
||||||
|
IRpcStubBuffer *stub;
|
||||||
|
ULONG ret;
|
||||||
|
|
||||||
|
hres = read_pipe(xhPipe, &header, sizeof(header));
|
||||||
|
if (hres) {
|
||||||
|
ERR("could not read disconnect header\n");
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
TRACE("read disconnect header\n");
|
||||||
|
|
||||||
|
hres = MARSHAL_Find_Stub_Buffer(&header.mid, &stub);
|
||||||
|
if (hres) {
|
||||||
|
ERR("could not locate stub to disconnect, mid.objectid=%p\n", (void*)header.mid.objectid);
|
||||||
|
goto end;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* release reference added by MARSHAL_Find_Stub_Buffer call */
|
||||||
|
IRpcStubBuffer_Release(stub);
|
||||||
|
/* release it for real */
|
||||||
|
ret = IRpcStubBuffer_Release(stub);
|
||||||
|
/* FIXME: race */
|
||||||
|
if (ret == 0)
|
||||||
|
MARSHAL_Invalidate_Stub_From_MID(&header.mid);
|
||||||
|
goto end;
|
||||||
|
} else if (reqtype == REQTYPE_REQUEST) {
|
||||||
wine_rpc_request *xreq;
|
wine_rpc_request *xreq;
|
||||||
RPC_GetRequest(&xreq);
|
RPC_GetRequest(&xreq);
|
||||||
xreq->hPipe = xhPipe;
|
xreq->hPipe = xhPipe;
|
||||||
hres = _xread(xhPipe,&(xreq->reqh),sizeof(xreq->reqh));
|
hres = read_pipe(xhPipe,&(xreq->reqh),sizeof(xreq->reqh));
|
||||||
if (hres) goto end;
|
if (hres) goto end;
|
||||||
xreq->resph.reqid = xreq->reqh.reqid;
|
xreq->resph.reqid = xreq->reqh.reqid;
|
||||||
xreq->Buffer = HeapAlloc(GetProcessHeap(),0, xreq->reqh.cbBuffer);
|
xreq->Buffer = HeapAlloc(GetProcessHeap(),0, xreq->reqh.cbBuffer);
|
||||||
hres = _xread(xhPipe,xreq->Buffer,xreq->reqh.cbBuffer);
|
hres = read_pipe(xhPipe,xreq->Buffer,xreq->reqh.cbBuffer);
|
||||||
if (hres) goto end;
|
if (hres) goto end;
|
||||||
xreq->state = REQSTATE_REQ_GOT;
|
xreq->state = REQSTATE_REQ_GOT;
|
||||||
goto end;
|
goto end;
|
||||||
}
|
} else if (reqtype == REQTYPE_RESPONSE) {
|
||||||
if (reqtype == REQTYPE_RESPONSE) {
|
|
||||||
wine_rpc_response_header resph;
|
wine_rpc_response_header resph;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
hres = _xread(xhPipe,&resph,sizeof(resph));
|
hres = read_pipe(xhPipe,&resph,sizeof(resph));
|
||||||
if (hres) goto end;
|
if (hres) goto end;
|
||||||
for (i=nrofreqs;i--;) {
|
for (i=nrofreqs;i--;) {
|
||||||
wine_rpc_request *xreq = reqs[i];
|
wine_rpc_request *xreq = reqs[i];
|
||||||
|
@ -613,7 +715,7 @@ _read_one(wine_pipe *xpipe) {
|
||||||
else
|
else
|
||||||
xreq->Buffer = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,xreq->resph.cbBuffer);
|
xreq->Buffer = HeapAlloc(GetProcessHeap(),HEAP_ZERO_MEMORY,xreq->resph.cbBuffer);
|
||||||
|
|
||||||
hres = _xread(xhPipe,xreq->Buffer,xreq->resph.cbBuffer);
|
hres = read_pipe(xhPipe,xreq->Buffer,xreq->resph.cbBuffer);
|
||||||
if (hres) goto end;
|
if (hres) goto end;
|
||||||
xreq->state = REQSTATE_RESP_GOT;
|
xreq->state = REQSTATE_RESP_GOT;
|
||||||
/*PulseEvent(hRpcChanged);*/
|
/*PulseEvent(hRpcChanged);*/
|
||||||
|
@ -635,18 +737,19 @@ static DWORD WINAPI
|
||||||
_StubReaderThread(LPVOID param) {
|
_StubReaderThread(LPVOID param) {
|
||||||
wine_pipe *xpipe = (wine_pipe*)param;
|
wine_pipe *xpipe = (wine_pipe*)param;
|
||||||
HANDLE xhPipe = xpipe->hPipe;
|
HANDLE xhPipe = xpipe->hPipe;
|
||||||
HRESULT hres;
|
HRESULT hres = S_OK;
|
||||||
|
|
||||||
TRACE("STUB reader thread %lx\n",GetCurrentProcessId());
|
TRACE("STUB reader thread %lx\n",GetCurrentProcessId());
|
||||||
while (1) {
|
while (!hres) {
|
||||||
int i;
|
int i;
|
||||||
hres = _read_one(xpipe);
|
hres = COM_RpcReceive(xpipe);
|
||||||
if (hres) break;
|
if (hres) break;
|
||||||
|
|
||||||
for (i=nrofreqs;i--;) {
|
for (i=nrofreqs;i--;) {
|
||||||
wine_rpc_request *xreq = reqs[i];
|
wine_rpc_request *xreq = reqs[i];
|
||||||
if ((xreq->state == REQSTATE_REQ_GOT) && (xreq->hPipe == xhPipe)) {
|
if ((xreq->state == REQSTATE_REQ_GOT) && (xreq->hPipe == xhPipe)) {
|
||||||
_invoke_onereq(xreq);
|
hres = COM_InvokeAndRpcSend(xreq);
|
||||||
|
if (!hres) break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -46,7 +46,7 @@ WINE_DEFAULT_DEBUG_CHANNEL(storage);
|
||||||
/*
|
/*
|
||||||
* Virtual function table for the StgStreamImpl class.
|
* Virtual function table for the StgStreamImpl class.
|
||||||
*/
|
*/
|
||||||
static ICOM_VTABLE(IStream) StgStreamImpl_Vtbl =
|
static IStreamVtbl StgStreamImpl_Vtbl =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
StgStreamImpl_QueryInterface,
|
StgStreamImpl_QueryInterface,
|
||||||
|
|
|
@ -90,10 +90,10 @@ static const BYTE STORAGE_magic[8] ={0xd0,0xcf,0x11,0xe0,0xa1,0xb1,0x1a,0xe1};
|
||||||
#define SMALLBLOCKS_PER_BIGBLOCK (BIGSIZE/SMALLSIZE)
|
#define SMALLBLOCKS_PER_BIGBLOCK (BIGSIZE/SMALLSIZE)
|
||||||
|
|
||||||
#define READ_HEADER STORAGE_get_big_block(hf,-1,(LPBYTE)&sth);assert(!memcmp(STORAGE_magic,sth.magic,sizeof(STORAGE_magic)));
|
#define READ_HEADER STORAGE_get_big_block(hf,-1,(LPBYTE)&sth);assert(!memcmp(STORAGE_magic,sth.magic,sizeof(STORAGE_magic)));
|
||||||
static ICOM_VTABLE(IStorage16) stvt16;
|
static IStorage16Vtbl stvt16;
|
||||||
static ICOM_VTABLE(IStorage16) *segstvt16 = NULL;
|
static IStorage16Vtbl *segstvt16 = NULL;
|
||||||
static ICOM_VTABLE(IStream16) strvt16;
|
static IStream16Vtbl strvt16;
|
||||||
static ICOM_VTABLE(IStream16) *segstrvt16 = NULL;
|
static IStream16Vtbl *segstrvt16 = NULL;
|
||||||
|
|
||||||
/*ULONG WINAPI IStorage16_AddRef(LPSTORAGE16 this);*/
|
/*ULONG WINAPI IStorage16_AddRef(LPSTORAGE16 this);*/
|
||||||
static void _create_istorage16(LPSTORAGE16 *stg);
|
static void _create_istorage16(LPSTORAGE16 *stg);
|
||||||
|
@ -954,7 +954,7 @@ STORAGE_get_free_pps_entry(HANDLE hf) {
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
/* IUnknown fields */
|
/* IUnknown fields */
|
||||||
ICOM_VFIELD(IStream16);
|
IStream16Vtbl *lpVtbl;
|
||||||
DWORD ref;
|
DWORD ref;
|
||||||
/* IStream16 fields */
|
/* IStream16 fields */
|
||||||
SEGPTR thisptr; /* pointer to this struct as segmented */
|
SEGPTR thisptr; /* pointer to this struct as segmented */
|
||||||
|
@ -1412,7 +1412,7 @@ static void _create_istream16(LPSTREAM16 *str) {
|
||||||
VTENT(Stat);
|
VTENT(Stat);
|
||||||
VTENT(Clone);
|
VTENT(Clone);
|
||||||
#undef VTENT
|
#undef VTENT
|
||||||
segstrvt16 = (ICOM_VTABLE(IStream16)*)MapLS( &strvt16 );
|
segstrvt16 = (IStream16Vtbl*)MapLS( &strvt16 );
|
||||||
} else {
|
} else {
|
||||||
#define VTENT(xfn) strvt16.xfn = IStream16_fn##xfn;
|
#define VTENT(xfn) strvt16.xfn = IStream16_fn##xfn;
|
||||||
VTENT(QueryInterface);
|
VTENT(QueryInterface);
|
||||||
|
@ -1448,7 +1448,7 @@ static void _create_istream16(LPSTREAM16 *str) {
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
/* IUnknown fields */
|
/* IUnknown fields */
|
||||||
ICOM_VFIELD(IStream);
|
IStreamVtbl *lpVtbl;
|
||||||
DWORD ref;
|
DWORD ref;
|
||||||
/* IStream32 fields */
|
/* IStream32 fields */
|
||||||
struct storage_pps_entry stde;
|
struct storage_pps_entry stde;
|
||||||
|
@ -1502,7 +1502,7 @@ ULONG WINAPI IStream_fnRelease(IStream* iface) {
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
/* IUnknown fields */
|
/* IUnknown fields */
|
||||||
ICOM_VFIELD(IStorage16);
|
IStorage16Vtbl *lpVtbl;
|
||||||
DWORD ref;
|
DWORD ref;
|
||||||
/* IStorage16 fields */
|
/* IStorage16 fields */
|
||||||
SEGPTR thisptr; /* pointer to this struct as segmented */
|
SEGPTR thisptr; /* pointer to this struct as segmented */
|
||||||
|
@ -1826,7 +1826,7 @@ static void _create_istorage16(LPSTORAGE16 *stg) {
|
||||||
VTENT(SetStateBits)
|
VTENT(SetStateBits)
|
||||||
VTENT(Stat)
|
VTENT(Stat)
|
||||||
#undef VTENT
|
#undef VTENT
|
||||||
segstvt16 = (ICOM_VTABLE(IStorage16)*)MapLS( &stvt16 );
|
segstvt16 = (IStorage16Vtbl*)MapLS( &stvt16 );
|
||||||
} else {
|
} else {
|
||||||
#define VTENT(xfn) stvt16.xfn = IStorage16_fn##xfn;
|
#define VTENT(xfn) stvt16.xfn = IStorage16_fn##xfn;
|
||||||
VTENT(QueryInterface)
|
VTENT(QueryInterface)
|
||||||
|
@ -1982,7 +1982,7 @@ HRESULT WINAPI StgIsStorageILockBytes16(SEGPTR plkbyt)
|
||||||
args[5] = 0;
|
args[5] = 0;
|
||||||
|
|
||||||
if (!K32WOWCallback16Ex(
|
if (!K32WOWCallback16Ex(
|
||||||
(DWORD)((ICOM_VTABLE(ILockBytes16)*)MapSL(
|
(DWORD)((ILockBytes16Vtbl*)MapSL(
|
||||||
(SEGPTR)((LPLOCKBYTES16)MapSL(plkbyt))->lpVtbl)
|
(SEGPTR)((LPLOCKBYTES16)MapSL(plkbyt))->lpVtbl)
|
||||||
)->ReadAt,
|
)->ReadAt,
|
||||||
WCB16_PASCAL,
|
WCB16_PASCAL,
|
||||||
|
|
|
@ -158,7 +158,7 @@ static DWORD GetCreationModeFromSTGM(DWORD stgm);
|
||||||
/*
|
/*
|
||||||
* Virtual function table for the IStorage32Impl class.
|
* Virtual function table for the IStorage32Impl class.
|
||||||
*/
|
*/
|
||||||
static ICOM_VTABLE(IStorage) Storage32Impl_Vtbl =
|
static IStorageVtbl Storage32Impl_Vtbl =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
StorageBaseImpl_QueryInterface,
|
StorageBaseImpl_QueryInterface,
|
||||||
|
@ -184,7 +184,7 @@ static ICOM_VTABLE(IStorage) Storage32Impl_Vtbl =
|
||||||
/*
|
/*
|
||||||
* Virtual function table for the Storage32InternalImpl class.
|
* Virtual function table for the Storage32InternalImpl class.
|
||||||
*/
|
*/
|
||||||
static ICOM_VTABLE(IStorage) Storage32InternalImpl_Vtbl =
|
static IStorageVtbl Storage32InternalImpl_Vtbl =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
StorageBaseImpl_QueryInterface,
|
StorageBaseImpl_QueryInterface,
|
||||||
|
@ -210,7 +210,7 @@ static ICOM_VTABLE(IStorage) Storage32InternalImpl_Vtbl =
|
||||||
/*
|
/*
|
||||||
* Virtual function table for the IEnumSTATSTGImpl class.
|
* Virtual function table for the IEnumSTATSTGImpl class.
|
||||||
*/
|
*/
|
||||||
static ICOM_VTABLE(IEnumSTATSTG) IEnumSTATSTGImpl_Vtbl =
|
static IEnumSTATSTGVtbl IEnumSTATSTGImpl_Vtbl =
|
||||||
{
|
{
|
||||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||||
IEnumSTATSTGImpl_QueryInterface,
|
IEnumSTATSTGImpl_QueryInterface,
|
||||||
|
@ -4104,7 +4104,9 @@ void StorageUtl_CopyPropertyToSTATSTG(
|
||||||
/*
|
/*
|
||||||
* The copy of the string occurs only when the flag is not set
|
* The copy of the string occurs only when the flag is not set
|
||||||
*/
|
*/
|
||||||
if ((statFlags & STATFLAG_NONAME) != 0)
|
if( ((statFlags & STATFLAG_NONAME) != 0) ||
|
||||||
|
(source->name == NULL) ||
|
||||||
|
(source->name[0] == 0) )
|
||||||
{
|
{
|
||||||
destination->pwcsName = 0;
|
destination->pwcsName = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -204,7 +204,7 @@ HRESULT OLECONVERT_CreateCompObjStream(LPSTORAGE pStorage, LPCSTR strOleTypeName
|
||||||
*/
|
*/
|
||||||
struct StorageBaseImpl
|
struct StorageBaseImpl
|
||||||
{
|
{
|
||||||
ICOM_VFIELD(IStorage); /* Needs to be the first item in the struct
|
IStorageVtbl *lpVtbl; /* Needs to be the first item in the struct
|
||||||
* since we want to cast this in a Storage32 pointer */
|
* since we want to cast this in a Storage32 pointer */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -298,7 +298,7 @@ HRESULT WINAPI StorageBaseImpl_SetClass(
|
||||||
*/
|
*/
|
||||||
struct StorageImpl
|
struct StorageImpl
|
||||||
{
|
{
|
||||||
ICOM_VFIELD(IStorage); /* Needs to be the first item in the struct
|
IStorageVtbl *lpVtbl; /* Needs to be the first item in the struct
|
||||||
* since we want to cast this in a Storage32 pointer */
|
* since we want to cast this in a Storage32 pointer */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -498,7 +498,7 @@ void Storage32Impl_SetExtDepotBlock(StorageImpl* This,
|
||||||
*/
|
*/
|
||||||
struct StorageInternalImpl
|
struct StorageInternalImpl
|
||||||
{
|
{
|
||||||
ICOM_VFIELD(IStorage); /* Needs to be the first item in the struct
|
IStorageVtbl *lpVtbl; /* Needs to be the first item in the struct
|
||||||
* since we want to cast this in a Storage32 pointer */
|
* since we want to cast this in a Storage32 pointer */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -542,8 +542,8 @@ HRESULT WINAPI StorageInternalImpl_Revert(
|
||||||
*/
|
*/
|
||||||
struct IEnumSTATSTGImpl
|
struct IEnumSTATSTGImpl
|
||||||
{
|
{
|
||||||
ICOM_VFIELD(IEnumSTATSTG); /* Needs to be the first item in the struct
|
IEnumSTATSTGVtbl *lpVtbl; /* Needs to be the first item in the struct
|
||||||
* since we want to cast this in a IEnumSTATSTG pointer */
|
* since we want to cast this in a IEnumSTATSTG pointer */
|
||||||
|
|
||||||
ULONG ref; /* Reference count */
|
ULONG ref; /* Reference count */
|
||||||
StorageImpl* parentStorage; /* Reference to the parent storage */
|
StorageImpl* parentStorage; /* Reference to the parent storage */
|
||||||
|
@ -627,8 +627,8 @@ INT IEnumSTATSTGImpl_FindParentProperty(
|
||||||
*/
|
*/
|
||||||
struct StgStreamImpl
|
struct StgStreamImpl
|
||||||
{
|
{
|
||||||
ICOM_VFIELD(IStream); /* Needs to be the first item in the struct
|
IStreamVtbl *lpVtbl; /* Needs to be the first item in the struct
|
||||||
* since we want to cast this in a IStream pointer */
|
* since we want to cast this in a IStream pointer */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Reference count
|
* Reference count
|
||||||
|
|
|
@ -1,26 +1,63 @@
|
||||||
Index: ifs.h
|
Index: ifs.h
|
||||||
===================================================================
|
===================================================================
|
||||||
RCS file: /home/wine/wine/dlls/ole32/ifs.h,v
|
RCS file: /home/wine/wine/dlls/ole32/ifs.h,v
|
||||||
retrieving revision 1.11
|
retrieving revision 1.12
|
||||||
diff -u -r1.11 ifs.h
|
diff -u -r1.12 ifs.h
|
||||||
--- ifs.h 23 Jan 2004 22:51:42 -0000 1.11
|
--- ifs.h 12 Aug 2004 03:33:30 -0000 1.12
|
||||||
+++ ifs.h 14 Mar 2004 09:24:36 -0000
|
+++ ifs.h 14 Aug 2004 20:12:56 -0000
|
||||||
@@ -35,6 +35,7 @@
|
@@ -33,8 +33,7 @@
|
||||||
|
* IMalloc16 interface
|
||||||
typedef struct IMalloc16 IMalloc16, *LPMALLOC16;
|
*/
|
||||||
|
|
||||||
|
-typedef struct IMalloc16 IMalloc16, *LPMALLOC16;
|
||||||
|
-
|
||||||
+#undef INTERFACE
|
+#undef INTERFACE
|
||||||
#define INTERFACE IMalloc16
|
#define INTERFACE IMalloc16
|
||||||
#define IMalloc16_METHODS \
|
#define IMalloc16_METHODS \
|
||||||
IUnknown_METHODS \
|
IUnknown_METHODS \
|
||||||
|
@@ -47,14 +46,14 @@
|
||||||
|
DECLARE_INTERFACE_(IMalloc16,IUnknown) { IMalloc16_METHODS };
|
||||||
|
#undef INTERFACE
|
||||||
|
|
||||||
|
+typedef struct IMalloc16 *LPMALLOC16;
|
||||||
|
+
|
||||||
|
/**********************************************************************/
|
||||||
|
|
||||||
|
extern LPMALLOC16 IMalloc16_Constructor();
|
||||||
|
|
||||||
|
/**********************************************************************/
|
||||||
|
|
||||||
|
-typedef struct ILockBytes16 *LPLOCKBYTES16, ILockBytes16;
|
||||||
|
-
|
||||||
|
#define INTERFACE ILockBytes
|
||||||
|
#define ILockBytes16_METHODS \
|
||||||
|
IUnknown_METHODS \
|
||||||
|
@@ -85,8 +84,6 @@
|
||||||
|
DWORD reserved;
|
||||||
|
} STATSTG16;
|
||||||
|
|
||||||
|
-typedef struct IStream16 IStream16, *LPSTREAM16;
|
||||||
|
-
|
||||||
|
#define INTERFACE IStream16
|
||||||
|
#define IStream16_METHODS \
|
||||||
|
ISequentialStream_METHODS \
|
||||||
|
@@ -105,8 +102,6 @@
|
||||||
|
/**********************************************************************/
|
||||||
|
|
||||||
|
typedef OLECHAR16 **SNB16;
|
||||||
|
-
|
||||||
|
-typedef struct IStorage16 IStorage16, *LPSTORAGE16;
|
||||||
|
|
||||||
|
#define INTERFACE IStorage16
|
||||||
|
#define IStorage16_METHODS \
|
||||||
Index: oleproxy.c
|
Index: oleproxy.c
|
||||||
===================================================================
|
===================================================================
|
||||||
RCS file: /home/wine/wine/dlls/ole32/oleproxy.c,v
|
RCS file: /home/wine/wine/dlls/ole32/oleproxy.c,v
|
||||||
retrieving revision 1.13
|
retrieving revision 1.19
|
||||||
diff -u -r1.13 oleproxy.c
|
diff -u -r1.19 oleproxy.c
|
||||||
--- oleproxy.c 23 Jan 2004 01:51:34 -0000 1.13
|
--- oleproxy.c 12 Aug 2004 23:00:55 -0000 1.19
|
||||||
+++ oleproxy.c 14 Mar 2004 09:24:39 -0000
|
+++ oleproxy.c 14 Aug 2004 20:13:00 -0000
|
||||||
@@ -35,6 +35,7 @@
|
@@ -38,6 +38,7 @@
|
||||||
|
|
||||||
#include <stdlib.h>
|
#include <stdlib.h>
|
||||||
#include <stdarg.h>
|
#include <stdarg.h>
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue