mirror of
git://source.winehq.org/git/wine.git
synced 2024-10-31 12:54:13 +00:00
Implement a class factory for the Global Interface Table.
This commit is contained in:
parent
0c63c39c8d
commit
739ccae798
4 changed files with 61 additions and 2 deletions
|
@ -62,7 +62,7 @@ static void COM_ExternalLockFreeList();
|
|||
|
||||
const CLSID CLSID_StdGlobalInterfaceTable = { 0x00000323, 0, 0, {0xc0, 0, 0, 0, 0, 0, 0, 0x46} };
|
||||
|
||||
static void* StdGlobalInterfaceTableInstance;
|
||||
|
||||
|
||||
APARTMENT MTA, *apts;
|
||||
static CRITICAL_SECTION csApartment = CRITICAL_SECTION_INIT("csApartment");
|
||||
|
|
|
@ -98,10 +98,13 @@ extern APARTMENT MTA, *apts;
|
|||
|
||||
extern void* StdGlobalInterfaceTable_Construct();
|
||||
extern void StdGlobalInterfaceTable_Destroy(void* self);
|
||||
extern HRESULT StdGlobalInterfaceTable_GetFactory(LPVOID *ppv);
|
||||
|
||||
extern HRESULT WINE_StringFromCLSID(const CLSID *id,LPSTR idstr);
|
||||
extern HRESULT create_marshalled_proxy(REFCLSID rclsid, REFIID iid, LPVOID *ppv);
|
||||
|
||||
extern void* StdGlobalInterfaceTableInstance;
|
||||
|
||||
inline static HRESULT
|
||||
get_facbuf_for_iid(REFIID riid,IPSFactoryBuffer **facbuf) {
|
||||
HRESULT hres;
|
||||
|
|
|
@ -74,6 +74,8 @@ typedef struct StdGlobalInterfaceTableImpl
|
|||
|
||||
} StdGlobalInterfaceTableImpl;
|
||||
|
||||
void* StdGlobalInterfaceTableInstance;
|
||||
|
||||
|
||||
/* IUnknown */
|
||||
static HRESULT WINAPI StdGlobalInterfaceTable_QueryInterface(IGlobalInterfaceTable* iface, REFIID riid, void** ppvObject);
|
||||
|
@ -105,6 +107,8 @@ static ICOM_VTABLE(IGlobalInterfaceTable) StdGlobalInterfaceTableImpl_Vtbl =
|
|||
void* StdGlobalInterfaceTable_Construct() {
|
||||
StdGlobalInterfaceTableImpl* newGIT;
|
||||
|
||||
TRACE("constructing\n");
|
||||
|
||||
newGIT = HeapAlloc(GetProcessHeap(), 0, sizeof(StdGlobalInterfaceTableImpl));
|
||||
if (newGIT == 0) return newGIT;
|
||||
|
||||
|
@ -141,6 +145,7 @@ StdGITEntry* StdGlobalInterfaceTable_FindEntry(IGlobalInterfaceTable* iface, DWO
|
|||
if (e->cookie == cookie) return e;
|
||||
e = e->next;
|
||||
}
|
||||
TRACE("Entry not found\n");
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
@ -198,7 +203,7 @@ HRESULT WINAPI StdGlobalInterfaceTable_RegisterInterfaceInGlobal(IGlobalInterfac
|
|||
HRESULT hres;
|
||||
StdGITEntry* entry;
|
||||
|
||||
TRACE("iface=%p, pUnk=%p, riid=%s, pdwCookie=%p\n", iface, pUnk, debugstr_guid(riid), pdwCookie);
|
||||
TRACE("iface=%p, pUnk=%p, riid=%s, pdwCookie=0x%p\n", iface, pUnk, debugstr_guid(riid), pdwCookie);
|
||||
|
||||
if (pUnk == NULL) return E_INVALIDARG;
|
||||
|
||||
|
@ -222,6 +227,7 @@ HRESULT WINAPI StdGlobalInterfaceTable_RegisterInterfaceInGlobal(IGlobalInterfac
|
|||
|
||||
/* and return the cookie */
|
||||
*pdwCookie = entry->cookie;
|
||||
TRACE("Cookie is 0x%ld\n", entry->cookie);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
|
@ -249,6 +255,8 @@ HRESULT WINAPI StdGlobalInterfaceTable_RevokeInterfaceFromGlobal(IGlobalInterfac
|
|||
HRESULT WINAPI StdGlobalInterfaceTable_GetInterfaceFromGlobal(IGlobalInterfaceTable* iface, DWORD dwCookie, REFIID riid, void **ppv) {
|
||||
StdGITEntry* entry;
|
||||
HRESULT hres;
|
||||
|
||||
TRACE("dwCookie=0x%lx, riid=%s\n", dwCookie, debugstr_guid(riid));
|
||||
|
||||
entry = StdGlobalInterfaceTable_FindEntry(iface, dwCookie);
|
||||
if (entry == NULL) return E_INVALIDARG;
|
||||
|
@ -260,3 +268,48 @@ HRESULT WINAPI StdGlobalInterfaceTable_GetInterfaceFromGlobal(IGlobalInterfaceTa
|
|||
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
/* Classfactory definition - despite what MSDN says, some programs need this */
|
||||
|
||||
static HRESULT WINAPI GITCF_QueryInterface(LPCLASSFACTORY iface,REFIID riid, LPVOID *ppv) {
|
||||
*ppv = NULL;
|
||||
if (IsEqualIID(riid,&IID_IUnknown) || IsEqualIID(riid,&IID_IGlobalInterfaceTable)) {
|
||||
*ppv = (LPVOID)iface;
|
||||
return S_OK;
|
||||
}
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
static ULONG WINAPI GITCF_AddRef(LPCLASSFACTORY iface) { return 2; }
|
||||
static ULONG WINAPI GITCF_Release(LPCLASSFACTORY iface) { return 1; }
|
||||
|
||||
static HRESULT WINAPI GITCF_CreateInstance(LPCLASSFACTORY iface, LPUNKNOWN pUnk, REFIID riid, LPVOID *ppv) {
|
||||
if (IsEqualIID(riid,&IID_IGlobalInterfaceTable)) {
|
||||
if (StdGlobalInterfaceTableInstance == NULL)
|
||||
StdGlobalInterfaceTableInstance = StdGlobalInterfaceTable_Construct();
|
||||
return IGlobalInterfaceTable_QueryInterface( (IGlobalInterfaceTable*) StdGlobalInterfaceTableInstance, riid, ppv);
|
||||
}
|
||||
|
||||
FIXME("(%s), not supported.\n",debugstr_guid(riid));
|
||||
return E_NOINTERFACE;
|
||||
}
|
||||
|
||||
static HRESULT WINAPI GITCF_LockServer(LPCLASSFACTORY iface, BOOL fLock) {
|
||||
FIXME("(%d), stub!\n",fLock);
|
||||
return S_OK;
|
||||
}
|
||||
|
||||
static ICOM_VTABLE(IClassFactory) GITClassFactoryVtbl = {
|
||||
ICOM_MSVTABLE_COMPAT_DummyRTTIVALUE
|
||||
GITCF_QueryInterface,
|
||||
GITCF_AddRef,
|
||||
GITCF_Release,
|
||||
GITCF_CreateInstance,
|
||||
GITCF_LockServer
|
||||
};
|
||||
static ICOM_VTABLE(IClassFactory) *PGITClassFactoryVtbl = &GITClassFactoryVtbl;
|
||||
|
||||
HRESULT StdGlobalInterfaceTable_GetFactory(LPVOID *ppv) {
|
||||
*ppv = &PGITClassFactoryVtbl;
|
||||
TRACE("Returning GIT classfactory\n");
|
||||
return S_OK;
|
||||
}
|
||||
|
|
|
@ -515,6 +515,9 @@ HRESULT WINAPI OLE32_DllGetClassObject(REFCLSID rclsid, REFIID iid,LPVOID *ppv)
|
|||
)
|
||||
)
|
||||
return MARSHAL_GetStandardMarshalCF(ppv);
|
||||
if (IsEqualIID(rclsid,&CLSID_StdGlobalInterfaceTable) && (IsEqualIID(iid,&IID_IClassFactory) || IsEqualIID(iid,&IID_IUnknown)))
|
||||
return StdGlobalInterfaceTable_GetFactory(ppv);
|
||||
|
||||
FIXME("\n\tCLSID:\t%s,\n\tIID:\t%s\n",debugstr_guid(rclsid),debugstr_guid(iid));
|
||||
return CLASS_E_CLASSNOTAVAILABLE;
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue