Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dostawcy mogą implementować niestandardowe zestawy właściwości w celu kontrolowania parametrów specyficznych dla urządzenia lub strumienia. Ogólnie rzecz biorąc, te zestawy właściwości jądra są uwidaczniane jako interfejsy COM przez niestandardową wtyczkę KsProxy dll. Podobnie można zaimplementować niestandardowe strony właściwości w celu zapewnienia interfejsów użytkownika w celu kontrolowania niestandardowych zestawów właściwości.
Aby utworzyć zestaw właściwości niestandardowych
Utwórz unikatowy identyfikator GUID dla zestawu właściwości przy użyciu Guidgen.exe. (To narzędzie jest dołączone do zestawu Microsoft Windows SDK).
Zaimplementuj zestaw właściwości w mini-sterowniku.
Aby utworzyć niestandardowy interfejs COM lub stronę właściwości dla zestawu właściwości
Utwórz niestandardową wtyczkę KsProxy w formie biblioteki DLL, która implementuje interfejs COM lub stronę właściwości. Identyfikator klasy (CLSID) dla wtyczki DLL musi być zgodny z identyfikatorem GUID zestawu właściwości. Link do pliku ksproxy.lib , aby uzyskać implementację ::KsSynchronousDeviceControl.
Dodaj standardowy mechanizm Microsoft DirectShow uwidaczniania CFactoryTemplateg_Templates z biblioteki DLL w celu umożliwienia samodzielnej rejestracji interfejsu.
Dodaj wiersze do pliku instalacyjnego urządzenia sprzętu (plik INF), aby uwidocznić interfejs COM i stronę właściwości, jak pokazano w poniższym przykładzie MyINF.inf .
Poniższy kod demonstruje implementację IAMCameraControl:
Camera.h
/*
Implements IAMCameraControl via KSPROPERTY_VIDCAP_CAMERACONTROL
*/
class CCameraControlInterfaceHandler :
public CUnknown,
public IAMCameraControl {
public:
DECLARE_IUNKNOWN;
static CUnknown* CALLBACK CreateInstance(
LPUNKNOWN UnkOuter,
HRESULT* hr);
CCameraControlInterfaceHandler(
LPUNKNOWN UnkOuter,
TCHAR* Name,
HRESULT* hr);
STDMETHODIMP NonDelegatingQueryInterface(
REFIID riid,
PVOID* ppv);
STDMETHODIMP Set(
IN long Property,
IN long lValue,
IN long Flags);
private:
HANDLE m_ObjectHandle;
};
Camera.cpp
/*
Implements IAMCameraControl via KSPROPERTY_VIDCAP_CAMERACONTROL
*/
#include "pch.h"
#include "camera.h"
CUnknown*
CALLBACK
CCameraControlInterfaceHandler::CreateInstance(
LPUNKNOWN UnkOuter,
HRESULT* hr
)
{
CUnknown *Unknown;
Unknown = new CCameraControlInterfaceHandler(UnkOuter, NAME("IAMCameraControl"), hr);
if (!Unknown) {
*hr = E_OUTOFMEMORY;
}
return Unknown;
}
CCameraControlInterfaceHandler::CCameraControlInterfaceHandler(
LPUNKNOWN UnkOuter,
TCHAR* Name,
HRESULT* hr
) :
CUnknown(Name, UnkOuter, hr)
{
if (SUCCEEDED(*hr)) {
if (UnkOuter) {
IKsObject* Object;
*hr = UnkOuter->QueryInterface(uuidof(IKsObject), reinterpret_cast<PVOID*>(&Object));
if (SUCCEEDED(*hr)) {
m_ObjectHandle = Object->KsGetObjectHandle();
// m_Object handle is file handle of the driver
if (!m_ObjectHandle) {
*hr = E_UNEXPECTED;
}
Object->Release();
}
} else {
*hr = VFW_E_NEED_OWNER;
}
}
}
STDMETHODIMP
CCameraControlInterfaceHandler::Set(
IN long Property,
IN long lValue,
IN long lFlags
)
{
KSPROPERTY_CAMERACONTROL_S CameraControl;
ULONG BytesReturned;
CameraControl.Property.Set = PROPSETID_VIDCAP_CAMERACONTROL;
CameraControl.Property.Id = Property;
CameraControl.Property.Flags = KSPROPERTY_TYPE_SET;
CameraControl.Value = lValue;
CameraControl.Flags = lFlags;
CameraControl.Capabilities = 0;
return ::KsSynchronousDeviceControl(
m_ObjectHandle,
IOCTL_KS_PROPERTY,
&CameraControl,
sizeof(CameraControl),
&CameraControl,
sizeof(CameraControl),
&BytesReturned);
}
STDMETHODIMP
CCameraControlInterfaceHandler::NonDelegatingQueryInterface(
REFIID riid,
PVOID* ppv
)
{
if (riid == uuidof(IAMCameraControl)) {
return GetInterface(static_cast<IAMCameraControl*>(this), ppv);
}
return CUnknown::NonDelegatingQueryInterface(riid, ppv);
}
MyINF.inf
;IAMCameraControl
HKCR,CLSID\{C6E13370-30AC-11d0-A18C-00A0C9118956},,,%PlugIn_IAMCameraControl%
HKCR,CLSID\{C6E13370-30AC-11d0-A18C-00A0C9118956}\InprocServer32,,,kswdmcap.ax
HKCR,CLSID\{C6E13370-30AC-11d0-A18C-00A0C9118956}\InprocServer32,ThreadingModel,,Both
; This IID is aggregated for the filter given the CLSID of the property set
HKLM,System\CurrentControlSet\Control\MediaInterfaces\{C6E13370-30AC-11d0-A18C-00A0C9118956},,,%PlugIn_IAMCameraControl%
HKLM,System\CurrentControlSet\Control\MediaInterfaces\{C6E13370-30AC-11d0-A18C-00A0C9118956},IID,1,70,33,E1,C6,AC,30,d0,11,A1,8C,00,A0,C9,11,89,56
; CameraControl Property Page
HKCR,CLSID\{71F96465-78F3-11d0-A18C-00A0C9118956},,,%PropPage_CameraControl%
HKCR,CLSID\{71F96465-78F3-11d0-A18C-00A0C9118956}\InprocServer32,,,kswdmcap.ax
HKCR,CLSID\{71F96465-78F3-11d0-A18C-00A0C9118956}\InprocServer32,ThreadingModel,,Both
; Associate the property set with the above property page
HKLM,System\CurrentControlSet\Control\MediaSets\{C6E13370-30AC-11d0-A18C-00A0C9118956}\PropertyPages\{71F96465-78F3-11d0-A18C-00A0C9118956},,,%PropPage_CameraControl%