📄 mediacatenum.c
字号:
res=CoCreateInstance(&clsID,NULL,CLSCTX_ALL,&IID_IUnknown,&pvptr);
pObj = (IUnknown*)pvptr;
}
}
if (pObj!=NULL)
{
/* get the requested interface from the loaded class */
res= IUnknown_QueryInterface(pObj,riidResult,ppvResult);
}
if (pProp)
{
IPropertyBag_Release(pProp);
}
TRACE("<- 0x%lx\n", res);
return res;
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_BindToStorage(
LPMONIKER iface,
IBindCtx* pbc,
IMoniker* pmkToLeft,
REFIID riid,
void** ppvObj)
{
MediaCatMoniker *This = (MediaCatMoniker *)iface;
TRACE("(%p)->(%p, %p, %s, %p)\n", This, pbc, pmkToLeft, debugstr_guid(riid), ppvObj);
*ppvObj = NULL;
if (pbc || pmkToLeft)
return MK_E_NOSTORAGE;
if (IsEqualGUID(riid, &IID_IPropertyBag))
{
HANDLE hkey;
DuplicateHandle(GetCurrentProcess(), This->hkey, GetCurrentProcess(), &hkey, 0, 0, DUPLICATE_SAME_ACCESS);
return DEVENUM_IPropertyBag_Construct(hkey, (IPropertyBag**)ppvObj);
}
return MK_E_NOSTORAGE;
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_Reduce(
LPMONIKER iface,
IBindCtx* pbc,
DWORD dwReduceHowFar,
IMoniker** ppmkToLeft,
IMoniker** ppmkReduced)
{
TRACE("(%p, %ld, %p, %p)\n", pbc, dwReduceHowFar, ppmkToLeft, ppmkReduced);
if (ppmkToLeft)
*ppmkToLeft = NULL;
*ppmkReduced = iface;
return MK_S_REDUCED_TO_SELF;
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_ComposeWith(
LPMONIKER iface,
IMoniker* pmkRight,
BOOL fOnlyIfNotGeneric,
IMoniker** ppmkComposite)
{
FIXME("(%p, %s, %p): stub\n", pmkRight, fOnlyIfNotGeneric ? "true" : "false", ppmkComposite);
/* FIXME: use CreateGenericComposite? */
*ppmkComposite = NULL;
return E_NOTIMPL;
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_Enum(
LPMONIKER iface,
BOOL fForward,
IEnumMoniker** ppenumMoniker)
{
FIXME("(%s, %p): stub\n", fForward ? "true" : "false", ppenumMoniker);
*ppenumMoniker = NULL;
return S_OK;
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_IsEqual(
LPMONIKER iface,
IMoniker* pmkOtherMoniker)
{
FIXME("(%p)\n", pmkOtherMoniker);
return E_NOTIMPL;
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_Hash(
LPMONIKER iface,
DWORD* pdwHash)
{
TRACE("(%p)\n", pdwHash);
*pdwHash = 0;
return S_OK;
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_IsRunning(
LPMONIKER iface,
IBindCtx* pbc,
IMoniker* pmkToLeft,
IMoniker* pmkNewlyRunning)
{
FIXME("(%p, %p, %p)\n", pbc, pmkToLeft, pmkNewlyRunning);
return S_FALSE;
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_GetTimeOfLastChange(
LPMONIKER iface,
IBindCtx* pbc,
IMoniker* pmkToLeft,
FILETIME* pFileTime)
{
TRACE("(%p, %p, %p)\n", pbc, pmkToLeft, pFileTime);
pFileTime->dwLowDateTime = 0xFFFFFFFF;
pFileTime->dwHighDateTime = 0x7FFFFFFF;
return MK_E_UNAVAILABLE;
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_Inverse(
LPMONIKER iface,
IMoniker** ppmk)
{
TRACE("(%p)\n", ppmk);
*ppmk = NULL;
return MK_E_NOINVERSE;
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_CommonPrefixWith(
LPMONIKER iface,
IMoniker* pmkOtherMoniker,
IMoniker** ppmkPrefix)
{
TRACE("(%p, %p)\n", pmkOtherMoniker, ppmkPrefix);
*ppmkPrefix = NULL;
return MK_E_NOPREFIX;
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_RelativePathTo(
LPMONIKER iface,
IMoniker* pmkOther,
IMoniker** ppmkRelPath)
{
TRACE("(%p, %p)\n", pmkOther, ppmkRelPath);
*ppmkRelPath = pmkOther;
return MK_S_HIM;
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_GetDisplayName(
LPMONIKER iface,
IBindCtx* pbc,
IMoniker* pmkToLeft,
LPOLESTR* ppszDisplayName)
{
MediaCatMoniker *This = (MediaCatMoniker *)iface;
WCHAR wszBuffer[MAX_PATH];
static const WCHAR wszFriendlyName[] = {'F','r','i','e','n','d','l','y','N','a','m','e',0};
LONG received = sizeof(wszFriendlyName);
TRACE("(%p, %p, %p)\n", pbc, pmkToLeft, ppszDisplayName);
*ppszDisplayName = NULL;
/* FIXME: should this be the weird stuff we have to parse in IParseDisplayName? */
if (RegQueryValueW(This->hkey, wszFriendlyName, wszBuffer, &received) == ERROR_SUCCESS)
{
*ppszDisplayName = CoTaskMemAlloc(received);
strcpyW(*ppszDisplayName, wszBuffer);
return S_OK;
}
return E_FAIL;
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_ParseDisplayName(
LPMONIKER iface,
IBindCtx* pbc,
IMoniker* pmkToLeft,
LPOLESTR pszDisplayName,
ULONG* pchEaten,
IMoniker** ppmkOut)
{
FIXME("(%p, %p, %s, %p, %p)\n", pbc, pmkToLeft, debugstr_w(pszDisplayName), pchEaten, ppmkOut);
*pchEaten = 0;
*ppmkOut = NULL;
return MK_E_SYNTAX;
}
static HRESULT WINAPI DEVENUM_IMediaCatMoniker_IsSystemMoniker(
LPMONIKER iface,
DWORD* pdwMksys)
{
TRACE("(%p)\n", pdwMksys);
return S_FALSE;
}
static IMonikerVtbl IMoniker_Vtbl =
{
DEVENUM_IMediaCatMoniker_QueryInterface,
DEVENUM_IMediaCatMoniker_AddRef,
DEVENUM_IMediaCatMoniker_Release,
DEVENUM_IMediaCatMoniker_GetClassID,
DEVENUM_IMediaCatMoniker_IsDirty,
DEVENUM_IMediaCatMoniker_Load,
DEVENUM_IMediaCatMoniker_Save,
DEVENUM_IMediaCatMoniker_GetSizeMax,
DEVENUM_IMediaCatMoniker_BindToObject,
DEVENUM_IMediaCatMoniker_BindToStorage,
DEVENUM_IMediaCatMoniker_Reduce,
DEVENUM_IMediaCatMoniker_ComposeWith,
DEVENUM_IMediaCatMoniker_Enum,
DEVENUM_IMediaCatMoniker_IsEqual,
DEVENUM_IMediaCatMoniker_Hash,
DEVENUM_IMediaCatMoniker_IsRunning,
DEVENUM_IMediaCatMoniker_GetTimeOfLastChange,
DEVENUM_IMediaCatMoniker_Inverse,
DEVENUM_IMediaCatMoniker_CommonPrefixWith,
DEVENUM_IMediaCatMoniker_RelativePathTo,
DEVENUM_IMediaCatMoniker_GetDisplayName,
DEVENUM_IMediaCatMoniker_ParseDisplayName,
DEVENUM_IMediaCatMoniker_IsSystemMoniker
};
MediaCatMoniker * DEVENUM_IMediaCatMoniker_Construct()
{
MediaCatMoniker * pMoniker = NULL;
pMoniker = CoTaskMemAlloc(sizeof(MediaCatMoniker));
if (!pMoniker)
return NULL;
pMoniker->lpVtbl = &IMoniker_Vtbl;
pMoniker->ref = 0;
pMoniker->hkey = NULL;
DEVENUM_IMediaCatMoniker_AddRef((LPMONIKER)pMoniker);
DEVENUM_LockModule();
return pMoniker;
}
/**********************************************************************
* DEVENUM_IEnumMoniker_QueryInterface (also IUnknown)
*/
static HRESULT WINAPI DEVENUM_IEnumMoniker_QueryInterface(
LPENUMMONIKER iface,
REFIID riid,
LPVOID *ppvObj)
{
EnumMonikerImpl *This = (EnumMonikerImpl *)iface;
TRACE("\n\tIID:\t%s\n",debugstr_guid(riid));
if (This == NULL || ppvObj == NULL) return E_POINTER;
if (IsEqualGUID(riid, &IID_IUnknown) ||
IsEqualGUID(riid, &IID_IEnumMoniker))
{
*ppvObj = (LPVOID)iface;
DEVENUM_IEnumMoniker_AddRef(iface);
return S_OK;
}
FIXME("- no interface\n\tIID:\t%s\n", debugstr_guid(riid));
return E_NOINTERFACE;
}
/**********************************************************************
* DEVENUM_IEnumMoniker_AddRef (also IUnknown)
*/
static ULONG WINAPI DEVENUM_IEnumMoniker_AddRef(LPENUMMONIKER iface)
{
EnumMonikerImpl *This = (EnumMonikerImpl *)iface;
TRACE("\n");
return InterlockedIncrement(&This->ref);
}
/**********************************************************************
* DEVENUM_IEnumMoniker_Release (also IUnknown)
*/
static ULONG WINAPI DEVENUM_IEnumMoniker_Release(LPENUMMONIKER iface)
{
EnumMonikerImpl *This = (EnumMonikerImpl *)iface;
TRACE("\n");
if (!InterlockedDecrement(&This->ref))
{
RegCloseKey(This->hkey);
CoTaskMemFree(This);
DEVENUM_UnlockModule();
return 0;
}
return This->ref;
}
static HRESULT WINAPI DEVENUM_IEnumMoniker_Next(LPENUMMONIKER iface, ULONG celt, IMoniker ** rgelt, ULONG * pceltFetched)
{
WCHAR buffer[MAX_PATH + 1];
LONG res;
ULONG fetched = 0;
MediaCatMoniker * pMoniker;
EnumMonikerImpl *This = (EnumMonikerImpl *)iface;
TRACE("(%ld, %p, %p)\n", celt, rgelt, pceltFetched);
while (fetched < celt)
{
res = RegEnumKeyW(This->hkey, This->index, buffer, sizeof(buffer) / sizeof(WCHAR));
if (res != ERROR_SUCCESS)
{
break;
}
pMoniker = DEVENUM_IMediaCatMoniker_Construct();
if (!pMoniker)
return E_OUTOFMEMORY;
if (RegOpenKeyW(This->hkey, buffer, &pMoniker->hkey) != ERROR_SUCCESS)
{
DEVENUM_IMediaCatMoniker_Release((LPMONIKER)pMoniker);
break;
}
rgelt[fetched] = (LPMONIKER)pMoniker;
fetched++;
}
This->index += fetched;
TRACE("-- fetched %ld\n", fetched);
if (pceltFetched)
*pceltFetched = fetched;
if (fetched != celt)
return S_FALSE;
else
return S_OK;
}
static HRESULT WINAPI DEVENUM_IEnumMoniker_Skip(LPENUMMONIKER iface, ULONG celt)
{
EnumMonikerImpl *This = (EnumMonikerImpl *)iface;
TRACE("(%ld)\n", celt);
This->index += celt;
return S_OK;
}
static HRESULT WINAPI DEVENUM_IEnumMoniker_Reset(LPENUMMONIKER iface)
{
EnumMonikerImpl *This = (EnumMonikerImpl *)iface;
TRACE("()\n");
This->index = 0;
return S_OK;
}
static HRESULT WINAPI DEVENUM_IEnumMoniker_Clone(LPENUMMONIKER iface, IEnumMoniker ** ppenum)
{
FIXME("(%p): stub\n", ppenum);
return E_NOTIMPL;
}
/**********************************************************************
* IEnumMoniker_Vtbl
*/
static IEnumMonikerVtbl IEnumMoniker_Vtbl =
{
DEVENUM_IEnumMoniker_QueryInterface,
DEVENUM_IEnumMoniker_AddRef,
DEVENUM_IEnumMoniker_Release,
DEVENUM_IEnumMoniker_Next,
DEVENUM_IEnumMoniker_Skip,
DEVENUM_IEnumMoniker_Reset,
DEVENUM_IEnumMoniker_Clone
};
HRESULT DEVENUM_IEnumMoniker_Construct(HKEY hkey, IEnumMoniker ** ppEnumMoniker)
{
EnumMonikerImpl * pEnumMoniker = CoTaskMemAlloc(sizeof(EnumMonikerImpl));
if (!pEnumMoniker)
return E_OUTOFMEMORY;
pEnumMoniker->lpVtbl = &IEnumMoniker_Vtbl;
pEnumMoniker->ref = 1;
pEnumMoniker->index = 0;
pEnumMoniker->hkey = hkey;
*ppEnumMoniker = (IEnumMoniker *)pEnumMoniker;
DEVENUM_LockModule();
return S_OK;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -