/* IMMDeviceCollection appears to have no QueryInterface method and instead forwards to mme */ static void test_collection(IMMDeviceEnumerator *mme, IMMDeviceCollection *col) { IMMDeviceCollection *col2; IMMDeviceEnumerator *mme2; IUnknown *unk; HRESULT hr; ULONG ref; UINT numdev; IMMDevice *dev; /* collection doesn't keep a ref on parent */ IUnknown_AddRef(mme); ref = IUnknown_Release(mme); ok(ref == 2, "Reference count on parent is %u\n", ref); ref = IUnknown_AddRef(col); IUnknown_Release(col); ok(ref == 2, "Invalid reference count %u on collection\n", ref); hr = IUnknown_QueryInterface(col, &IID_IUnknown, NULL); ok(hr == E_POINTER, "Null ppv returns %08x\n", hr); hr = IUnknown_QueryInterface(col, &IID_IUnknown, (void**)&unk); ok(hr == S_OK, "Cannot query for IID_IUnknown: 0x%08x\n", hr); if (hr == S_OK) { ok((LONG_PTR)col == (LONG_PTR)unk, "Pointers are not identical %p/%p/%p\n", col, unk, mme); IUnknown_Release(unk); } hr = IUnknown_QueryInterface(col, &IID_IMMDeviceCollection, (void**)&col2); ok(hr == S_OK, "Cannot query for IID_IMMDeviceCollection: 0x%08x\n", hr); if (hr == S_OK) IUnknown_Release(col2); hr = IUnknown_QueryInterface(col, &IID_IMMDeviceEnumerator, (void**)&mme2); ok(hr == E_NOINTERFACE, "Query for IID_IMMDeviceEnumerator returned: 0x%08x\n", hr); if (hr == S_OK) IUnknown_Release(mme2); hr = IMMDeviceCollection_GetCount(col, NULL); ok(hr == E_POINTER, "GetCount returned 0x%08x\n", hr); hr = IMMDeviceCollection_GetCount(col, &numdev); ok(hr == S_OK, "GetCount returned 0x%08x\n", hr); dev = (void*)(LONG_PTR)0x12345678; hr = IMMDeviceCollection_Item(col, numdev, &dev); ok(hr == E_INVALIDARG, "Asking for too high device returned 0x%08x\n", hr); ok(dev == NULL, "Returned non-null device\n"); if (numdev) { hr = IMMDeviceCollection_Item(col, 0, NULL); ok(hr == E_POINTER, "Query with null pointer returned 0x%08x\n", hr); hr = IMMDeviceCollection_Item(col, 0, &dev); ok(hr == S_OK, "Valid Item returned 0x%08x\n", hr); ok(dev != NULL, "Device is null!\n"); if (dev != NULL) { char temp[128]; WCHAR *id = NULL; if (IMMDevice_GetId(dev, &id) == S_OK) { IMMDevice *dev2; temp[sizeof(temp)-1] = 0; WideCharToMultiByte(CP_ACP, 0, id, -1, temp, sizeof(temp)-1, NULL, NULL); trace("Device found: %s\n", temp); hr = IMMDeviceEnumerator_GetDevice(mme, id, &dev2); ok(hr == S_OK, "GetDevice failed: %08x\n", hr); IMMDevice_Release(dev2); CoTaskMemFree(id); } } if (dev) IUnknown_Release(dev); } IUnknown_Release(col); }
static ULONG WINAPI ConnectionPointContainer_AddRef(IConnectionPointContainer *iface) { ConnectionPointContainer *This = CONPTCONT_THIS(iface); return IUnknown_AddRef(This->outer); }
static ULONG WINAPI IDirectMusicSysExTrack_IDirectMusicTrack_AddRef (LPDIRECTMUSICTRACK8 iface) { ICOM_THIS_MULTI(IDirectMusicSysExTrack, TrackVtbl, iface); return IUnknown_AddRef ((LPUNKNOWN)&This->UnknownVtbl); }
/************************************************************************* * SafeArrayGetElement (OLEAUT32.25) * * Get an item from a SafeArray. * * PARAMS * psa [I] SafeArray to get from * rgIndices [I] Indices to get from * pvData [O] Destination for data * * RETURNS * Success: S_OK. The item data is returned in pvData. * Failure: An HRESULT error code indicating the error. * * NOTES * See SafeArray. */ HRESULT WINAPI SafeArrayGetElement(SAFEARRAY *psa, LONG *rgIndices, void *pvData) { HRESULT hRet; TRACE("(%p,%p,%p)\n", psa, rgIndices, pvData); if (!psa || !rgIndices || !pvData) return E_INVALIDARG; hRet = SafeArrayLock(psa); if (SUCCEEDED(hRet)) { PVOID lpvSrc; hRet = SafeArrayPtrOfIndex(psa, rgIndices, &lpvSrc); if (SUCCEEDED(hRet)) { if (psa->fFeatures & FADF_VARIANT) { VARIANT* lpVariant = lpvSrc; VARIANT* lpDest = pvData; /* The original content of pvData is ignored. */ V_VT(lpDest) = VT_EMPTY; hRet = VariantCopy(lpDest, lpVariant); if (FAILED(hRet)) FIXME("VariantCopy failed with 0x%x\n", hRet); } else if (psa->fFeatures & FADF_BSTR) { BSTR* lpBstr = lpvSrc; BSTR* lpDest = pvData; if (*lpBstr) { *lpDest = SysAllocStringByteLen((char*)*lpBstr, SysStringByteLen(*lpBstr)); if (!*lpBstr) hRet = E_OUTOFMEMORY; } else *lpDest = NULL; } else if (psa->fFeatures & (FADF_UNKNOWN|FADF_DISPATCH)) { IUnknown **src_unk = lpvSrc; IUnknown **dest_unk = pvData; if (*src_unk) IUnknown_AddRef(*src_unk); *dest_unk = *src_unk; } else if (psa->fFeatures & FADF_RECORD) { IRecordInfo *record; SafeArrayGetRecordInfo(psa, &record); hRet = IRecordInfo_RecordCopy(record, lpvSrc, pvData); IRecordInfo_Release(record); } else /* Copy the data over */ memcpy(pvData, lpvSrc, psa->cbElements); } SafeArrayUnlock(psa); } return hRet; }
static ULONG WINAPI JpegDecoder_Frame_AddRef(IWICBitmapFrameDecode *iface) { JpegDecoder *This = decoder_from_frame(iface); return IUnknown_AddRef((IUnknown*)This); }
static ULONG WINAPI PPB_AddRef(IPersistPropertyBag * iface) { VfwCapture *This = impl_from_IPersistPropertyBag(iface); return IUnknown_AddRef(This->outer_unk); }
/* Copy data items from one array to another. Destination data is freed before copy. */ static HRESULT SAFEARRAY_CopyData(SAFEARRAY *psa, SAFEARRAY *dest) { HRESULT hr = S_OK; if (!psa->pvData) return S_OK; if (!dest->pvData || psa->fFeatures & FADF_DATADELETED) return E_INVALIDARG; else { ULONG ulCellCount = SAFEARRAY_GetCellCount(psa); dest->fFeatures = (dest->fFeatures & FADF_CREATEVECTOR) | (psa->fFeatures & ~ignored_copy_features); if (psa->fFeatures & FADF_VARIANT) { VARIANT *src_var = psa->pvData; VARIANT *dest_var = dest->pvData; while(ulCellCount--) { HRESULT hRet; /* destination is cleared automatically */ hRet = VariantCopy(dest_var, src_var); if (FAILED(hRet)) FIXME("VariantCopy failed with 0x%08x, element %u\n", hRet, ulCellCount); src_var++; dest_var++; } } else if (psa->fFeatures & FADF_BSTR) { BSTR *src_bstr = psa->pvData; BSTR *dest_bstr = dest->pvData; while(ulCellCount--) { SysFreeString(*dest_bstr); if (*src_bstr) { *dest_bstr = SysAllocStringByteLen((char*)*src_bstr, SysStringByteLen(*src_bstr)); if (!*dest_bstr) return E_OUTOFMEMORY; } else *dest_bstr = NULL; src_bstr++; dest_bstr++; } } else if (psa->fFeatures & FADF_RECORD) { BYTE *dest_data = dest->pvData; BYTE *src_data = psa->pvData; IRecordInfo *record; SafeArrayGetRecordInfo(psa, &record); while (ulCellCount--) { /* RecordCopy() clears destination record */ hr = IRecordInfo_RecordCopy(record, src_data, dest_data); if (FAILED(hr)) break; src_data += psa->cbElements; dest_data += psa->cbElements; } SafeArraySetRecordInfo(dest, record); /* This value is set to 32 bytes by default on descriptor creation, update with actual structure size. */ dest->cbElements = psa->cbElements; IRecordInfo_Release(record); } else if (psa->fFeatures & (FADF_UNKNOWN|FADF_DISPATCH)) { IUnknown **dest_unk = dest->pvData; IUnknown **src_unk = psa->pvData; /* release old iface, addref new one */ while (ulCellCount--) { if (*dest_unk) IUnknown_Release(*dest_unk); *dest_unk = *src_unk; if (*dest_unk) IUnknown_AddRef(*dest_unk); src_unk++; dest_unk++; } } else { /* Copy the data over */ memcpy(dest->pvData, psa->pvData, ulCellCount * psa->cbElements); } if (psa->fFeatures & FADF_HAVEIID) { GUID guid; SafeArrayGetIID(psa, &guid); SafeArraySetIID(dest, &guid); } else if (psa->fFeatures & FADF_HAVEVARTYPE) { SAFEARRAY_SetHiddenDWORD(dest, SAFEARRAY_GetHiddenDWORD(psa)); } } return hr; }
static ULONG WINAPI IDirectMusicBandImpl_IDirectMusicBand_AddRef (LPDIRECTMUSICBAND iface) { ICOM_THIS_MULTI(IDirectMusicBandImpl, BandVtbl, iface); return IUnknown_AddRef ((LPUNKNOWN)&This->UnknownVtbl); }
static ULONG WINAPI NullRendererImpl_Seeking_AddRef(IMediaSeeking * iface) { NullRendererImpl *This = impl_from_IMediaSeeking(iface); return IUnknown_AddRef((IUnknown *)This); }
static ULONG WINAPI TargetFrame2_AddRef(ITargetFrame2 *iface) { HlinkFrame *This = impl_from_ITargetFrame2(iface); return IUnknown_AddRef(This->outer); }
static ULONG WINAPI HlinkFrame_AddRef(IHlinkFrame *iface) { HlinkFrame *This = impl_from_IHlinkFrame(iface); return IUnknown_AddRef(This->outer); }
static HRESULT WINAPI BindProtocol_QueryInterface(IInternetProtocol *iface, REFIID riid, void **ppv) { BindProtocol *This = PROTOCOL_THIS(iface); *ppv = NULL; if(IsEqualGUID(&IID_IUnknown, riid)) { TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); *ppv = PROTOCOL(This); }else if(IsEqualGUID(&IID_IInternetProtocolRoot, riid)) { TRACE("(%p)->(IID_IInternetProtocolRoot %p)\n", This, ppv); *ppv = PROTOCOL(This); }else if(IsEqualGUID(&IID_IInternetProtocol, riid)) { TRACE("(%p)->(IID_IInternetProtocol %p)\n", This, ppv); *ppv = PROTOCOL(This); }else if(IsEqualGUID(&IID_IInternetBindInfo, riid)) { TRACE("(%p)->(IID_IInternetBindInfo %p)\n", This, ppv); *ppv = BINDINFO(This); }else if(IsEqualGUID(&IID_IInternetPriority, riid)) { TRACE("(%p)->(IID_IInternetPriority %p)\n", This, ppv); *ppv = PRIORITY(This); }else if(IsEqualGUID(&IID_IAuthenticate, riid)) { FIXME("(%p)->(IID_IAuthenticate %p)\n", This, ppv); }else if(IsEqualGUID(&IID_IServiceProvider, riid)) { TRACE("(%p)->(IID_IServiceProvider %p)\n", This, ppv); *ppv = SERVPROV(This); }else if(IsEqualGUID(&IID_IInternetProtocolSink, riid)) { TRACE("(%p)->(IID_IInternetProtocolSink %p)\n", This, ppv); *ppv = PROTSINK(This); }else if(IsEqualGUID(&IID_IWinInetInfo, riid)) { TRACE("(%p)->(IID_IWinInetInfo %p)\n", This, ppv); if(This->protocol) { IWinInetInfo *inet_info; HRESULT hres; hres = IInternetProtocol_QueryInterface(This->protocol, &IID_IWinInetInfo, (void**)&inet_info); if(SUCCEEDED(hres)) { *ppv = HTTPINFO(This); IWinInetInfo_Release(inet_info); } } }else if(IsEqualGUID(&IID_IWinInetHttpInfo, riid)) { TRACE("(%p)->(IID_IWinInetHttpInfo %p)\n", This, ppv); if(This->protocol) { IWinInetHttpInfo *http_info; HRESULT hres; hres = IInternetProtocol_QueryInterface(This->protocol, &IID_IWinInetHttpInfo, (void**)&http_info); if(SUCCEEDED(hres)) { *ppv = HTTPINFO(This); IWinInetHttpInfo_Release(http_info); } } }else { WARN("not supported interface %s\n", debugstr_guid(riid)); } if(!*ppv) return E_NOINTERFACE; IUnknown_AddRef((IUnknown*)*ppv); return S_OK; }
static HRESULT WINAPI WebBrowser_QueryInterface(IWebBrowser2 *iface, REFIID riid, LPVOID *ppv) { WebBrowser *This = impl_from_IWebBrowser2(iface); if (ppv == NULL) return E_POINTER; *ppv = NULL; if(IsEqualGUID(&IID_IUnknown, riid)) { TRACE("(%p)->(IID_IUnknown %p)\n", This, ppv); *ppv = &This->IWebBrowser2_iface; }else if(IsEqualGUID(&IID_IDispatch, riid)) { TRACE("(%p)->(IID_IDispatch %p)\n", This, ppv); *ppv = &This->IWebBrowser2_iface; }else if(IsEqualGUID(&IID_IWebBrowser, riid)) { TRACE("(%p)->(IID_IWebBrowser %p)\n", This, ppv); *ppv = &This->IWebBrowser2_iface; }else if(IsEqualGUID(&IID_IWebBrowserApp, riid)) { TRACE("(%p)->(IID_IWebBrowserApp %p)\n", This, ppv); *ppv = &This->IWebBrowser2_iface; }else if(IsEqualGUID(&IID_IWebBrowser2, riid)) { TRACE("(%p)->(IID_IWebBrowser2 %p)\n", This, ppv); *ppv = &This->IWebBrowser2_iface; }else if(IsEqualGUID(&IID_IOleObject, riid)) { TRACE("(%p)->(IID_IOleObject %p)\n", This, ppv); *ppv = &This->IOleObject_iface; }else if(IsEqualGUID(&IID_IOleWindow, riid)) { TRACE("(%p)->(IID_IOleWindow %p)\n", This, ppv); *ppv = &This->IOleInPlaceObject_iface; }else if(IsEqualGUID (&IID_IOleInPlaceObject, riid)) { TRACE("(%p)->(IID_IOleInPlaceObject %p)\n", This, ppv); *ppv = &This->IOleInPlaceObject_iface; }else if(IsEqualGUID(&IID_IOleControl, riid)) { TRACE("(%p)->(IID_IOleControl %p)\n", This, ppv); *ppv = &This->IOleControl_iface; }else if(IsEqualGUID(&IID_IPersist, riid)) { TRACE("(%p)->(IID_IPersist %p)\n", This, ppv); *ppv = &This->IPersistStorage_iface; }else if(IsEqualGUID(&IID_IPersistStorage, riid)) { TRACE("(%p)->(IID_IPersistStorage %p)\n", This, ppv); *ppv = &This->IPersistStorage_iface; }else if(IsEqualGUID(&IID_IPersistMemory, riid)) { TRACE("(%p)->(IID_IPersistStorage %p)\n", This, ppv); *ppv = &This->IPersistMemory_iface; }else if(IsEqualGUID (&IID_IPersistStreamInit, riid)) { TRACE("(%p)->(IID_IPersistStreamInit %p)\n", This, ppv); *ppv = &This->IPersistStreamInit_iface; }else if(IsEqualGUID(&IID_IProvideClassInfo, riid)) { TRACE("(%p)->(IID_IProvideClassInfo %p)\n", This, ppv); *ppv = &This->IProvideClassInfo2_iface; }else if(IsEqualGUID(&IID_IProvideClassInfo2, riid)) { TRACE("(%p)->(IID_IProvideClassInfo2 %p)\n", This, ppv); *ppv = &This->IProvideClassInfo2_iface; }else if(IsEqualGUID(&IID_IConnectionPointContainer, riid)) { TRACE("(%p)->(IID_IConnectionPointContainer %p)\n", This, ppv); *ppv = &This->doc_host.cps.IConnectionPointContainer_iface; }else if(IsEqualGUID(&IID_IViewObject, riid)) { TRACE("(%p)->(IID_IViewObject %p)\n", This, ppv); *ppv = &This->IViewObject2_iface; }else if(IsEqualGUID(&IID_IViewObject2, riid)) { TRACE("(%p)->(IID_IViewObject2 %p)\n", This, ppv); *ppv = &This->IViewObject2_iface; }else if(IsEqualGUID(&IID_IOleInPlaceActiveObject, riid)) { TRACE("(%p)->(IID_IOleInPlaceActiveObject %p)\n", This, ppv); *ppv = &This->IOleInPlaceActiveObject_iface; }else if(IsEqualGUID(&IID_IOleCommandTarget, riid)) { TRACE("(%p)->(IID_IOleCommandTarget %p)\n", This, ppv); *ppv = &This->IOleCommandTarget_iface; }else if(IsEqualGUID(&IID_IServiceProvider, riid)) { *ppv = &This->IServiceProvider_iface; TRACE("(%p)->(IID_IServiceProvider %p)\n", This, ppv); }else if(IsEqualGUID(&IID_IDataObject, riid)) { *ppv = &This->IDataObject_iface; TRACE("(%p)->(IID_IDataObject %p)\n", This, ppv); }else if(IsEqualGUID(&IID_IQuickActivate, riid)) { TRACE("(%p)->(IID_IQuickActivate %p) returning NULL\n", This, ppv); return E_NOINTERFACE; }else if(IsEqualGUID(&IID_IRunnableObject, riid)) { TRACE("(%p)->(IID_IRunnableObject %p) returning NULL\n", This, ppv); return E_NOINTERFACE; }else if(IsEqualGUID(&IID_IPerPropertyBrowsing, riid)) { TRACE("(%p)->(IID_IPerPropertyBrowsing %p) returning NULL\n", This, ppv); return E_NOINTERFACE; }else if(IsEqualGUID(&IID_IOleCache, riid)) { TRACE("(%p)->(IID_IOleCache %p) returning NULL\n", This, ppv); return E_NOINTERFACE; }else if(IsEqualGUID(&IID_IOleInPlaceSite, riid)) { TRACE("(%p)->(IID_IOleInPlaceSite %p) returning NULL\n", This, ppv); return E_NOINTERFACE; }else if(IsEqualGUID(&IID_IObjectWithSite, riid)) { TRACE("(%p)->(IID_IObjectWithSite %p) returning NULL\n", This, ppv); return E_NOINTERFACE; }else if(IsEqualGUID(&IID_IViewObjectEx, riid)) { TRACE("(%p)->(IID_IViewObjectEx %p) returning NULL\n", This, ppv); return E_NOINTERFACE; }else if(IsEqualGUID(&IID_IOleLink, riid)) { TRACE("(%p)->(IID_IOleLink %p) returning NULL\n", This, ppv); return E_NOINTERFACE; }else if(IsEqualGUID(&IID_IMarshal, riid)) { TRACE("(%p)->(IID_IMarshal %p) returning NULL\n", This, ppv); return E_NOINTERFACE; }else if(IsEqualGUID(&IID_IStdMarshalInfo, riid)) { TRACE("(%p)->(IID_IStdMarshalInfo %p) returning NULL\n", This, ppv); return E_NOINTERFACE; }else if(HlinkFrame_QI(&This->hlink_frame, riid, ppv)) { return S_OK; } if(*ppv) { IUnknown_AddRef((IUnknown*)*ppv); return S_OK; } FIXME("(%p)->(%s %p) interface not supported\n", This, debugstr_guid(riid), ppv); return E_NOINTERFACE; }
static ULONG WINAPI WebBrowserPriv2IE9_AddRef(IWebBrowserPriv2IE9 *iface) { HlinkFrame *This = impl_from_IWebBrowserPriv2IE9(iface); return IUnknown_AddRef(This->outer); }
static ULONG WINAPI AMStreamConfig_AddRef( IAMStreamConfig * iface ) { VfwCapture *This = impl_from_IAMStreamConfig(iface); return IUnknown_AddRef(This->outer_unk); }
/*********************************************************************** * AtlAxCreateControlEx [ATL.@] * * REMARKS * See http://www.codeproject.com/com/cwebpage.asp for some background * */ HRESULT WINAPI AtlAxCreateControlEx(LPCOLESTR lpszName, HWND hWnd, IStream *pStream, IUnknown **ppUnkContainer, IUnknown **ppUnkControl, REFIID iidSink, IUnknown *punkSink) { CLSID controlId; HRESULT hRes; IOleObject *pControl; IUnknown *pUnkControl; IPersistStreamInit *pPSInit; IUnknown *pContainer; enum {IsGUID=0,IsHTML=1,IsURL=2} content; TRACE("(%s %p %p %p %p %p %p)\n", debugstr_w(lpszName), hWnd, pStream, ppUnkContainer, ppUnkControl, iidSink, punkSink); hRes = CLSIDFromString( lpszName, &controlId ); if ( FAILED(hRes) ) hRes = CLSIDFromProgID( lpszName, &controlId ); if ( SUCCEEDED( hRes ) ) content = IsGUID; else { /* FIXME - check for MSHTML: prefix! */ content = IsURL; controlId = CLSID_WebBrowser; } hRes = CoCreateInstance( &controlId, 0, CLSCTX_ALL, &IID_IOleObject, (void**) &pControl ); if ( FAILED( hRes ) ) { WARN( "cannot create ActiveX control %s instance - error 0x%08x\n", debugstr_guid( &controlId ), hRes ); return hRes; } hRes = IOleObject_QueryInterface( pControl, &IID_IPersistStreamInit, (void**) &pPSInit ); if ( SUCCEEDED( hRes ) ) { if (!pStream) IPersistStreamInit_InitNew( pPSInit ); else IPersistStreamInit_Load( pPSInit, pStream ); IPersistStreamInit_Release( pPSInit ); } else WARN("cannot get IID_IPersistStreamInit out of control\n"); IOleObject_QueryInterface( pControl, &IID_IUnknown, (void**) &pUnkControl ); IOleObject_Release( pControl ); hRes = AtlAxAttachControl( pUnkControl, hWnd, &pContainer ); if ( FAILED( hRes ) ) WARN("cannot attach control to window\n"); if ( content == IsURL ) { IWebBrowser2 *browser; hRes = IOleObject_QueryInterface( pControl, &IID_IWebBrowser2, (void**) &browser ); if ( !browser ) WARN( "Cannot query IWebBrowser2 interface: %08x\n", hRes ); else { VARIANT url; IWebBrowser2_put_Visible( browser, VARIANT_TRUE ); /* it seems that native does this on URL (but do not on MSHTML:! why? */ V_VT(&url) = VT_BSTR; V_BSTR(&url) = SysAllocString( lpszName ); hRes = IWebBrowser2_Navigate2( browser, &url, NULL, NULL, NULL, NULL ); if ( FAILED( hRes ) ) WARN( "IWebBrowser2::Navigate2 failed: %08x\n", hRes ); SysFreeString( V_BSTR(&url) ); IWebBrowser2_Release( browser ); } } if (ppUnkContainer) { *ppUnkContainer = pContainer; if ( pContainer ) IUnknown_AddRef( pContainer ); } if (ppUnkControl) { *ppUnkControl = pUnkControl; if ( pUnkControl ) IUnknown_AddRef( pUnkControl ); } if ( pUnkControl ) IUnknown_Release( pUnkControl ); if ( pContainer ) IUnknown_Release( pContainer ); return S_OK; }
static ULONG WINAPI AMVideoProcAmp_AddRef(IAMVideoProcAmp * iface) { VfwCapture *This = impl_from_IAMVideoProcAmp(iface); return IUnknown_AddRef(This->outer_unk); }
static ULONG WINAPI DispatchEx_AddRef(IDispatchEx *iface) { DispatchEx *This = impl_from_IDispatchEx(iface); return IUnknown_AddRef(This->outer); }
static ULONG get_refcount(IUnknown *iface) { IUnknown_AddRef(iface); return IUnknown_Release(iface); }
static int get_refcount(IUnknown *object) { IUnknown_AddRef(object); return IUnknown_Release(object); }
/************************************************************************* * SafeArrayPutElement (OLEAUT32.26) * * Put an item into a SafeArray. * * PARAMS * psa [I] SafeArray to insert into * rgIndices [I] Indices to insert at * pvData [I] Data to insert * * RETURNS * Success: S_OK. The item is inserted * Failure: An HRESULT error code indicating the error. * * NOTES * See SafeArray. */ HRESULT WINAPI SafeArrayPutElement(SAFEARRAY *psa, LONG *rgIndices, void *pvData) { HRESULT hRet; TRACE("(%p,%p,%p)\n", psa, rgIndices, pvData); if (!psa || !rgIndices) return E_INVALIDARG; hRet = SafeArrayLock(psa); if (SUCCEEDED(hRet)) { PVOID lpvDest; hRet = SafeArrayPtrOfIndex(psa, rgIndices, &lpvDest); if (SUCCEEDED(hRet)) { if (psa->fFeatures & FADF_VARIANT) { VARIANT* lpVariant = pvData; VARIANT* lpDest = lpvDest; hRet = VariantCopy(lpDest, lpVariant); if (FAILED(hRet)) FIXME("VariantCopy failed with 0x%x\n", hRet); } else if (psa->fFeatures & FADF_BSTR) { BSTR lpBstr = (BSTR)pvData; BSTR* lpDest = lpvDest; SysFreeString(*lpDest); *lpDest = SysAllocStringByteLen((char*)lpBstr, SysStringByteLen(lpBstr)); if (!*lpDest) hRet = E_OUTOFMEMORY; } else if (psa->fFeatures & (FADF_UNKNOWN|FADF_DISPATCH)) { IUnknown *lpUnknown = pvData; IUnknown **lpDest = lpvDest; if (lpUnknown) IUnknown_AddRef(lpUnknown); if (*lpDest) IUnknown_Release(*lpDest); *lpDest = lpUnknown; } else if (psa->fFeatures & FADF_RECORD) { IRecordInfo *record; SafeArrayGetRecordInfo(psa, &record); hRet = IRecordInfo_RecordCopy(record, pvData, lpvDest); IRecordInfo_Release(record); } else /* Copy the data over */ memcpy(lpvDest, pvData, psa->cbElements); } SafeArrayUnlock(psa); } return hRet; }
static ULONG WINAPI VideoRenderer_AddRef(IBaseFilter * iface) { VideoRendererImpl *This = impl_from_IBaseFilter(iface); return IUnknown_AddRef(This->outer_unk); }
static ULONG WINAPI DispatchEx_AddRef(IDispatchEx *iface) { DispatchEx *This = DISPATCHEX_THIS(iface); return IUnknown_AddRef(This->outer); }
static ULONG WINAPI AMFilterMiscFlags_AddRef(IAMFilterMiscFlags *iface) { VideoRendererImpl *This = impl_from_IAMFilterMiscFlags(iface); return IUnknown_AddRef(This->outer_unk); }
static ULONG WINAPI Timeline_IAMTimeline_AddRef(IAMTimeline *iface) { TimelineImpl *This = impl_from_IAMTimeline(iface); return IUnknown_AddRef(This->outer_unk); }
static void test_COM(void) { IDirectSoundFullDuplex *dsfd = (IDirectSoundFullDuplex*)0xdeadbeef; IDirectSound *ds; IDirectSound8 *ds8; IDirectSoundCapture *dsc; IUnknown *unk, *unk8; IDirectSoundBuffer8 *dsb8; IDirectSoundCaptureBuffer8 *dscb8; DSBUFFERDESC bufdesc; DSCBUFFERDESC cbufdesc; WAVEFORMATEX wfx; ULONG refcount; HRESULT hr; /* COM aggregation */ hr = CoCreateInstance(&CLSID_DirectSoundFullDuplex, (IUnknown*)&dsfd, CLSCTX_INPROC_SERVER, &IID_IUnknown, (void**)&dsfd); ok(hr == CLASS_E_NOAGGREGATION, "DirectSoundFullDuplex create failed: %08x, expected CLASS_E_NOAGGREGATION\n", hr); ok(!dsfd, "dsfd = %p\n", dsfd); /* Invalid RIID */ hr = CoCreateInstance(&CLSID_DirectSoundFullDuplex, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectSound3DBuffer, (void**)&dsfd); ok(hr == E_NOINTERFACE, "DirectSoundFullDuplex create failed: %08x, expected E_NOINTERFACE\n", hr); /* Different refcount for IDirectSoundFullDuplex and for IUnknown */ hr = CoCreateInstance(&CLSID_DirectSoundFullDuplex, NULL, CLSCTX_INPROC_SERVER, &IID_IDirectSoundFullDuplex, (void**)&dsfd); ok(hr == S_OK, "DirectSoundFullDuplex create failed: %08x, expected S_OK\n", hr); refcount = IDirectSoundFullDuplex_AddRef(dsfd); ok(refcount == 2, "refcount == %u, expected 2\n", refcount); hr = IDirectSoundFullDuplex_QueryInterface(dsfd, &IID_IUnknown, (void**)&unk); ok(hr == S_OK, "QueryInterface for IID_IUnknown failed: %08x\n", hr); refcount = IUnknown_AddRef(unk); ok(refcount == 2, "refcount == %u, expected 2\n", refcount); /* Not initialized */ hr = IDirectSoundFullDuplex_QueryInterface(dsfd, &IID_IDirectSound8, (void**)&ds8); ok(hr == E_NOINTERFACE, "QueryInterface for IID_IDirectSound8 failed: %08x, expected E_NOINTERFACE\n", hr); hr = IDirectSoundFullDuplex_QueryInterface(dsfd, &IID_IDirectSoundCapture, (void**)&dsc); ok(hr == E_NOINTERFACE, "QueryInterface for IID_IDirectSoundCapture failed: %08x, expected E_NOINTERFACE\n", hr); init_format(&wfx, WAVE_FORMAT_PCM, 44100, 16, 1); ZeroMemory(&bufdesc, sizeof(bufdesc)); bufdesc.dwSize = sizeof(bufdesc); bufdesc.dwBufferBytes = wfx.nAvgBytesPerSec; bufdesc.lpwfxFormat = &wfx; ZeroMemory(&cbufdesc, sizeof(cbufdesc)); cbufdesc.dwSize = sizeof(cbufdesc); cbufdesc.dwBufferBytes = wfx.nAvgBytesPerSec; cbufdesc.lpwfxFormat = &wfx; hr = IDirectSoundFullDuplex_Initialize(dsfd, NULL, NULL, &cbufdesc, &bufdesc, get_hwnd(), DSSCL_EXCLUSIVE, NULL, NULL); ok(hr == E_INVALIDARG, "IDirectSoundFullDuplex_Initialize failed: %08x, expected E_INVALIDARG\n", hr); hr = IDirectSoundFullDuplex_Initialize(dsfd, NULL, NULL, &cbufdesc, &bufdesc, get_hwnd(), DSSCL_EXCLUSIVE, &dscb8, &dsb8); if (hr == DSERR_NODRIVER || hr == DSERR_INVALIDCALL) { skip("No driver\n"); return; } ok(hr == S_OK, "IDirectSoundFullDuplex_Initialize failed: %08x\n", hr); /* IDirectSound and IDirectSound8 */ hr = IDirectSoundFullDuplex_QueryInterface(dsfd, &IID_IDirectSound8, (void**)&ds8); ok(hr == S_OK, "QueryInterface for IID_IDirectSound8 failed: %08x\n", hr); refcount = IDirectSound8_AddRef(ds8); ok(refcount == 2, "refcount == %u, expected 2\n", refcount); hr = IDirectSoundFullDuplex_QueryInterface(dsfd, &IID_IDirectSound, (void**)&ds); ok(hr == S_OK, "QueryInterface for IID_IDirectSound failed: %08x\n", hr); refcount = IDirectSound8_AddRef(ds8); ok(refcount == 4, "refcount == %u, expected 4\n", refcount); refcount = IDirectSound_AddRef(ds); ok(refcount == 5, "refcount == %u, expected 5\n", refcount); hr = IDirectSound8_QueryInterface(ds8, &IID_IUnknown, (void**)&unk8); ok(hr == S_OK, "QueryInterface for IID_IUnknown failed: %08x\n", hr); ok(unk == unk8, "Got different IUnknown when QI'ing IDirectSoundFullDuplex and IDirectSound\n"); refcount = IUnknown_AddRef(unk8); ok(refcount == 4, "refcount == %u, expected 4\n", refcount); refcount = IDirectSound_AddRef(ds); ok(refcount == 6, "refcount == %u, expected 6\n", refcount); refcount = IDirectSoundFullDuplex_AddRef(dsfd); ok(refcount == 3, "refcount == %u, expected 3\n", refcount); /* IDirectSoundCapture */ hr = IDirectSoundFullDuplex_QueryInterface(dsfd, &IID_IDirectSoundCapture, (void**)&dsc); ok(hr == S_OK, "QueryInterface for IID_IDirectSoundCapture failed: %08x\n", hr); refcount = IDirectSoundCapture_AddRef(dsc); ok(refcount == 2, "refcount == %u, expected 2\n", refcount); refcount = IDirectSoundFullDuplex_AddRef(dsfd); ok(refcount == 4, "refcount == %u, expected 4\n", refcount); hr = IDirectSoundCapture_QueryInterface(ds8, &IID_IUnknown, (void**)&unk8); ok(hr == S_OK, "QueryInterface for IID_IUnknown failed: %08x\n", hr); ok(unk == unk8, "Got different IUnknown when QI'ing IDirectSoundFullDuplex and IDirectSoundCapture\n"); refcount = IUnknown_AddRef(unk8); ok(refcount == 6, "refcount == %u, expected 6\n", refcount); IDirectSoundBuffer8_Release(dsb8); IDirectSoundCaptureBuffer8_Release(dscb8); while (IDirectSound8_Release(ds8)); while (IDirectSoundCapture_Release(dsc)); while (IDirectSoundFullDuplex_Release(dsfd)); while (IUnknown_Release(unk)); }
static ULONG WINAPI IDirectMusicSysExTrack_IPersistStream_AddRef (LPPERSISTSTREAM iface) { ICOM_THIS_MULTI(IDirectMusicSysExTrack, PersistStreamVtbl, iface); return IUnknown_AddRef ((LPUNKNOWN)&This->UnknownVtbl); }
static ULONG WINAPI VfwCapture_AddRef(IBaseFilter *iface) { VfwCapture *This = impl_from_IBaseFilter(iface); return IUnknown_AddRef(This->outer_unk); }
static ULONG WINAPI stillimagew_AddRef(IStillImageW *iface) { stillimage *This = impl_from_IStillImageW(iface); return IUnknown_AddRef(This->pUnkOuter); }
/* IUnknown */ static ULONG WINAPI SampleGrabber_IMemInputPin_AddRef(IMemInputPin *iface) { SG_Impl *This = impl_from_IMemInputPin(iface); return IUnknown_AddRef(This->outer_unk); }