diff --git a/dlls/devenum/Makefile.in b/dlls/devenum/Makefile.in index d563b9a83e4..6ce1967a6dd 100644 --- a/dlls/devenum/Makefile.in +++ b/dlls/devenum/Makefile.in @@ -1,5 +1,5 @@ MODULE = devenum.dll -IMPORTS = strmiids uuid ole32 oleaut32 avicap32 winmm user32 advapi32 dsound msdmo +IMPORTS = dmoguids strmiids uuid ole32 oleaut32 avicap32 winmm user32 advapi32 dsound msdmo DELAYIMPORTS = msvfw32 EXTRADLLFLAGS = -mno-cygwin diff --git a/dlls/devenum/devenum_private.h b/dlls/devenum/devenum_private.h index 43a5a0c50e1..6bd3c7cac4f 100644 --- a/dlls/devenum/devenum_private.h +++ b/dlls/devenum/devenum_private.h @@ -22,21 +22,10 @@ * - Private file where devenum globals are declared */ -#include - -#include "windef.h" -#include "winbase.h" -#include "wingdi.h" -#include "winuser.h" -#include "winreg.h" -#include "winerror.h" - #define COBJMACROS - -#include "ole2.h" -#include "strmif.h" -#include "olectl.h" -#include "uuids.h" +#include "dshow.h" +#include "dmo.h" +#include "dmodshow.h" /********************************************************************** * Dll lifetime tracking declaration for devenum.dll diff --git a/dlls/devenum/mediacatenum.c b/dlls/devenum/mediacatenum.c index d0c4a303b56..c0006ad53ef 100644 --- a/dlls/devenum/mediacatenum.c +++ b/dlls/devenum/mediacatenum.c @@ -23,9 +23,6 @@ */ #include "devenum_private.h" -#include "oleauto.h" -#include "ocidl.h" -#include "dmoreg.h" #include "wine/debug.h" @@ -393,9 +390,25 @@ static HRESULT WINAPI moniker_BindToObject(IMoniker *iface, IBindCtx *bind_ctx, if (!out) return E_POINTER; - VariantInit(&var); *out = NULL; + if (moniker->type == DEVICE_DMO) + { + IDMOWrapperFilter *wrapper; + + if (FAILED(hr = CoCreateInstance(&CLSID_DMOWrapperFilter, NULL, + CLSCTX_INPROC_SERVER, &IID_IDMOWrapperFilter, (void **)&wrapper))) + return hr; + + if (SUCCEEDED(hr = IDMOWrapperFilter_Init(wrapper, &moniker->clsid, &moniker->class))) + { + hr = IDMOWrapperFilter_QueryInterface(wrapper, iid, out); + } + IDMOWrapperFilter_Release(wrapper); + return hr; + } + + VariantInit(&var); V_VT(&var) = VT_BSTR; if (FAILED(hr = IPropertyBag_Read(&moniker->IPropertyBag_iface, L"CLSID", &var, NULL))) return hr; diff --git a/dlls/devenum/tests/devenum.c b/dlls/devenum/tests/devenum.c index decc53ff814..93692f75e62 100644 --- a/dlls/devenum/tests/devenum.c +++ b/dlls/devenum/tests/devenum.c @@ -20,20 +20,15 @@ #define COBJMACROS -#include - -#include "wine/test.h" #include "initguid.h" -#include "ole2.h" -#include "strmif.h" -#include "uuids.h" -#include "vfwmsgs.h" -#include "mmsystem.h" +#include "dshow.h" +#include "dmo.h" +#include "dmodshow.h" #include "dsound.h" #include "mmddk.h" #include "vfw.h" -#include "dmoreg.h" #include "setupapi.h" +#include "wine/test.h" DEFINE_GUID(GUID_NULL,0,0,0,0,0,0,0,0,0,0,0); @@ -603,10 +598,15 @@ static void test_dmo(void) { IParseDisplayName *parser; IPropertyBag *prop_bag; + IBaseFilter *filter; + IMediaObject *dmo; + IEnumDMO *enumdmo; WCHAR buffer[200]; IMoniker *mon; VARIANT var; + WCHAR *name; HRESULT hr; + GUID clsid; hr = CoCreateInstance(&CLSID_CDeviceMoniker, NULL, CLSCTX_INPROC, &IID_IParseDisplayName, (void **)&parser); ok(hr == S_OK, "Failed to create ParseDisplayName: %#x\n", hr); @@ -657,6 +657,54 @@ static void test_dmo(void) } IPropertyBag_Release(prop_bag); IMoniker_Release(mon); + + hr = DMOEnum(&DMOCATEGORY_AUDIO_DECODER, 0, 0, NULL, 0, NULL, &enumdmo); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + while (IEnumDMO_Next(enumdmo, 1, &clsid, &name, NULL) == S_OK) + { + wcscpy(buffer, L"@device:dmo:"); + StringFromGUID2(&clsid, buffer + wcslen(buffer), CHARS_IN_GUID); + StringFromGUID2(&DMOCATEGORY_AUDIO_DECODER, buffer + wcslen(buffer), CHARS_IN_GUID); + mon = check_display_name(parser, buffer); + ok(find_moniker(&DMOCATEGORY_AUDIO_DECODER, mon), "DMO was not found.\n"); + + hr = IMoniker_BindToStorage(mon, NULL, NULL, &IID_IPropertyBag, (void **)&prop_bag); + ok(hr == S_OK, "Got hr %#x.\n", hr); + + VariantClear(&var); + hr = IPropertyBag_Read(prop_bag, L"FriendlyName", &var, NULL); + ok(hr == S_OK, "got %#x\n", hr); + ok(!wcscmp(V_BSTR(&var), name), "got %s\n", wine_dbgstr_w(V_BSTR(&var))); + + VariantClear(&var); + V_VT(&var) = VT_BSTR; + V_BSTR(&var) = SysAllocString(L"devenum test"); + hr = IPropertyBag_Write(prop_bag, L"FriendlyName", &var); + ok(hr == E_ACCESSDENIED, "Write failed: %#x\n", hr); + + VariantClear(&var); + hr = IPropertyBag_Read(prop_bag, L"CLSID", &var, NULL); + ok(hr == HRESULT_FROM_WIN32(ERROR_NOT_FOUND), "got %#x\n", hr); + + IPropertyBag_Release(prop_bag); + CoTaskMemFree(name); + + hr = IMoniker_BindToObject(mon, NULL, NULL, &IID_IBaseFilter, (void **)&filter); + ok(hr == S_OK, "got %#x\n", hr); + + hr = IBaseFilter_GetClassID(filter, &clsid); + ok(hr == S_OK, "got %#x\n", hr); + ok(IsEqualGUID(&clsid, &CLSID_DMOWrapperFilter), "Got CLSID %s.\n", debugstr_guid(&clsid)); + + hr = IBaseFilter_QueryInterface(filter, &IID_IMediaObject, (void **)&dmo); + ok(hr == S_OK, "got %#x\n", hr); + IMediaObject_Release(dmo); + + IBaseFilter_Release(filter); + } + IEnumDMO_Release(enumdmo); + IParseDisplayName_Release(parser); }