Add vfwindex when enumerating devices, and make sure every device has

a unique registry key, so multiple devices with same name are allowed.
This commit is contained in:
Maarten Lankhorst 2005-05-18 18:25:12 +00:00 committed by Alexandre Julliard
parent 67204137ee
commit db3be15567
2 changed files with 19 additions and 6 deletions

View File

@ -5,7 +5,7 @@ VPATH = @srcdir@
MODULE = devenum.dll
IMPORTLIB = libdevenum.$(IMPLIBEXT)
IMPORTS = ole32 oleaut32 avicap32 winmm user32 advapi32 kernel32
EXTRALIBS = -lstrmiids -luuid
EXTRALIBS = -lstrmiids -luuid $(LIBUNICODE)
C_SRCS = \
createdevenum.c \

View File

@ -30,6 +30,7 @@
#include "vfw.h"
#include "wine/debug.h"
#include "wine/unicode.h"
#include "mmddk.h"
WINE_DEFAULT_DEBUG_CHANNEL(devenum);
@ -420,13 +421,17 @@ static HRESULT DEVENUM_CreateSpecialCategories()
if (SUCCEEDED(res))
for (i = 0; i < 10; i++)
{
WCHAR szDeviceName[80], szDeviceVersion[80];
WCHAR szDeviceName[32], szDeviceVersion[32], szDevicePath[10];
if (capGetDriverDescriptionW ((WORD) i,
szDeviceName, sizeof(szDeviceName)/sizeof(WCHAR),
szDeviceVersion, sizeof(szDeviceVersion)/sizeof(WCHAR)))
{
IMoniker * pMoniker = NULL;
IPropertyBag * pPropBag = NULL;
WCHAR dprintf[] = { 'v','i','d','e','o','%','d',0 };
snprintfW(szDevicePath, sizeof(szDevicePath)/sizeof(WCHAR), dprintf, i);
/* The above code prevents 1 device with a different ID overwriting another */
rfp2.nMediaTypes = 1;
pTypes = CoTaskMemAlloc(rfp2.nMediaTypes * sizeof(REGPINTYPES));
@ -436,7 +441,7 @@ static HRESULT DEVENUM_CreateSpecialCategories()
}
pTypes[0].clsMajorType = &MEDIATYPE_Video;
pTypes[0].clsMinorType = &MEDIASUBTYPE_RGB24;
pTypes[0].clsMinorType = &MEDIASUBTYPE_None;
rfp2.lpMediaType = pTypes;
@ -445,11 +450,19 @@ static HRESULT DEVENUM_CreateSpecialCategories()
szDeviceName,
&pMoniker,
&CLSID_VideoInputDeviceCategory,
szDeviceName,
szDevicePath,
&rf2);
/* FIXME: do additional stuff with IMoniker here, depending on what RegisterFilter does */
if (pMoniker) IMoniker_Release(pMoniker);
if (pMoniker) {
OLECHAR wszVfwIndex[] = { 'V','F','W','I','n','d','e','x',0 };
VARIANT var;
V_VT(&var) = VT_I4;
V_UNION(&var, ulVal) = (ULONG)i;
res = IMoniker_BindToStorage(pMoniker, NULL, NULL, &IID_IPropertyBag, (LPVOID)&pPropBag);
if (SUCCEEDED(res))
res = IPropertyBag_Write(pPropBag, wszVfwIndex, &var);
IMoniker_Release(pMoniker);
}
if (i == iDefaultDevice) FIXME("Default device\n");
CoTaskMemFree(pTypes);