Создание примера элемента управления "Модуль расширения"
Важно!
Содержимое и пример кода в этом разделе устарели и в настоящее время не поддерживаются. Он может не работать с текущей цепочкой инструментов разработки драйверов.
Вы можете скомпилировать код, приведенный в этом разделе, для создания примера элемента управления расширения UVC. При сборке этого проекта создается элемент управления Microsoft ActiveX, который можно использовать с соответствующим приложением для получения и задания свойств в модуле расширения.
Для использования элемента управления требуется оборудование, реализующее определенные функциональные возможности модуля расширения. Кроме того, можно использовать ЭМУЛЯТОР USB.
Чтобы создать элемент управления, выполните следующие действия:
Установите следующие пакеты:
- Пакет средств разработки драйверов Microsoft Windows Server 2003 с пакетом обновления 1 (SP1)
- Обновление пакета SDK для Microsoft DirectX 9.0 (февраль 2005 г.)
- Дополнительные возможности пакета SDK для Microsoft DirectX 9.0 за февраль 2005 г.
Скопируйте пример кода из следующих разделов в отдельные файлы.
Пример интерфейса для единиц расширения UVC
Пример подключаемого модуля расширения DLL
Пример записи реестра для единиц расширения UVC
Пример приложения для единиц расширения UVC
Поддержка событий автоматического обновления с помощью единиц расширения
Создайте исходный файл следующим образом:
TARGETNAME= uvcxuplgn TARGETTYPE= DYNLINK TARGETPATH= obj TARGETEXT= ax DLLENTRY=_DllMainCRTStartup DLLBASE=0x10080000 USE_MSVCRT=1 USE_STATIC_ATL=1 USER_INCLUDES= $(O) INCLUDES= SOURCES= interface.idl \ uvcxuplgn.cpp \ stdafx.cpp \ interface_i.c \ vidcap_i.c \ xuproxy.cpp TARGETLIBS= \ $(SDK_LIB_PATH)\kernel32.lib \ $(SDK_LIB_PATH)\user32.lib \ $(SDK_LIB_PATH)\gdi32.lib \ $(SDK_LIB_PATH)\advapi32.lib \ $(SDK_LIB_PATH)\comdlg32.lib \ $(SDK_LIB_PATH)\ole32.lib \ $(SDK_LIB_PATH)\oleaut32.lib \ $(SDK_LIB_PATH)\uuid.lib \ $(SDK_LIB_PATH)\comctl32.lib
Создайте файл makefile следующим образом:
############################################################################# # # Copyright (C) Microsoft Corporation 1995 # All Rights Reserved. # # MAKEFILE for WDM device driver kit # ############################################################################# # # DO NOT EDIT THIS FILE!!! Edit .\sources. if you want to add a new source # file to this component. This file merely indirects to the real make file # that is shared by all the driver components of the Windows NT DDK # !if "$(WIN2K_DDKBUILD)" == "" !INCLUDE $(NTMAKEENV)\makefile.def !endif
Используйте средствоGuidgen.exe (которое входит в состав Microsoft Windows SDK) для создания трех идентификаторов GUID:
- Используйте первый GUID в качестве идентификатора набора свойств для модуля расширения. Замените заполнители GUID на основе X новым GUID в Xuproxy.h, Xusample.rgs,Xuplgin.inf и в дескрипторе блока расширения на аппаратном уровне.
- Используйте второй GUID в качестве IID для модуля расширения. Замените заполнители GUID на основе y новым GUID в Interface.idl и Xuplgin.inf.
- Используйте третий GUID в качестве GUID класса (clsid) для единицы расширения. Замените заполнитель GUID на основе z новым GUID в Xuplgin.inf, Xuproxy.h и Xusample.rgs.
Создайте Uvcxuplgn.def следующим образом:
LIBRARY uvcxuplgn EXPORTS DllGetClassObject PRIVATE DllCanUnloadNow PRIVATE DllRegisterServer PRIVATE DllUnregisterServer PRIVATE
Создайте Uvcxuplgn.cpp следующим образом:
#include "stdafx.h" CComModule _Module; #include <initguid.h> #include "interface.h" #include "xuproxy.h" BEGIN_OBJECT_MAP(ObjectMap) OBJECT_ENTRY(CLSID_ExtensionUnit, CExtension) END_OBJECT_MAP() STDAPI DllRegisterServer(void) { return _Module.RegisterServer(FALSE, NULL); } STDAPI DllUnregisterServer(void) { return _Module.UnregisterServer(); } EXTERN_C BOOL DllMain( HINSTANCE hinst, DWORD dwReason, LPVOID lpReserved) { switch (dwReason) { case DLL_PROCESS_ATTACH: _Module.Init (ObjectMap, hinst); break; case DLL_PROCESS_DETACH: _Module.Term(); break; } return TRUE; } extern "C" STDMETHODIMP DllCanUnloadNow(void) { return _Module.GetLockCount()==0 ? S_OK : S_FALSE; } extern "C" STDAPI DllGetClassObject( REFCLSID rclsid, REFIID riid, LPVOID *ppv) { return _Module.GetClassObject(rclsid, riid, ppv); }
Создайте Stdafx.h следующим образом:
// stdafx.h : include file for standard system include files, // or project specific include files that are used frequently, // but are changed infrequently #if !defined(AFX_STDAFX_H__722DC775_FE6F_42FB_BED5_E1E299976D17__INCLUDED_) #define AFX_STDAFX_H__722DC775_FE6F_42FB_BED5_E1E299976D17__INCLUDED_ #if _MSC_VER > 1000 #pragma once #endif // _MSC_VER > 1000 #define STRICT #ifndef _WIN32_WINNT #define _WIN32_WINNT 0x0400 #endif #define _ATL_APARTMENT_THREADED #include <atlbase.h> //You may derive a class from CComModule and use it if you want to override //something, but do not change the name of _Module extern CComModule _Module; #include <atlcom.h> #include <atlctl.h> //{{AFX_INSERT_LOCATION}} // Microsoft Visual C++ will insert additional declarations immediately before the previous line. #endif // !defined(AFX_STDAFX_H__722DC775_FE6F_42FB_BED5_E1E299976D17__INCLUDED)
Создайте Stdafx.cpp следующим образом:
// stdafx.cpp : source file that includes just the standard includes // stdafx.pch will be the pre-compiled header // stdafx.obj will contain the pre-compiled type information #include "stdafx.h" #ifdef _ATL_STATIC_REGISTRY #include <statreg.h> #include <statreg.cpp> #endif #include <atlimpl.cpp>
Выполните сборку примера,
Build -cZg
вызвав в среде сборки WDK.
См. также раздел
Примеры кода модуля расширения UVC
Пример интерфейса для единиц расширения UVC
Пример подключаемого модуля расширения DLL
Пример записи реестра для единиц расширения UVC
Пример приложения для единиц расширения UVC
Поддержка событий автоматического обновления с помощью единиц расширения