Criando o controle de exemplo de unidade de extensão
Importante
O conteúdo e o código de exemplo neste tópico estão desatualizados e atualmente sem suporte. Ele pode não funcionar com a cadeia de ferramentas de desenvolvimento de driver atual.
Você pode compilar o código nesta seção para criar um controle de exemplo de unidade de extensão UVC. Ao criar esse projeto, você cria um controle Do Microsoft ActiveX que pode ser usado com um aplicativo correspondente para obter e definir propriedades em uma unidade de extensão.
Para usar o controle, você precisa de hardware que implemente a funcionalidade de unidade de extensão específica. Como alternativa, você pode usar um emulador USB.
Use estas etapas para criar o controle:
Instale os seguintes pacotes:
- Microsoft Windows Server 2003 com O DDK (Kit de Desenvolvimento de Driver) do Service Pack 1 (SP1)
- Atualização do SDK do Microsoft DirectX 9.0 (fevereiro de 2005)
- Extras do SDK do Microsoft DirectX 9.0 de fevereiro de 2005
Copie o código de exemplo dos tópicos a seguir em arquivos individuais.
Interface de exemplo para unidades de extensão UVC
DLL de plug-in de unidade de extensão de exemplo
Entrada de registro de exemplo para unidades de extensão UVC
Aplicativo de exemplo para unidades de extensão UVC
Suporte a eventos de autenticação automática com unidades de extensão
Crie um arquivo de fontes da seguinte maneira:
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
Crie um arquivo makefile da seguinte maneira:
############################################################################# # # 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
Use a ferramenta Guidgen.exe (que está incluída no SDK do Microsoft Windows) para criar três GUIDs:
- Use o primeiro GUID como a ID do conjunto de propriedades para sua unidade de extensão. Substitua os espaços reservados guid baseados em x pelo novo GUID em Xuproxy.h, Xusample.rgs, Xuplgin.inf e no descritor de unidade de extensão no nível do hardware.
- Use o segundo GUID como o IID para sua unidade de extensão. Substitua os espaços reservados guid baseados em y pelo novo GUID em Interface.idl e Xuplgin.inf.
- Use o terceiro GUID como o GUID da classe (clsid) para sua unidade de extensão. Substitua o espaço reservado guid baseado em z pelo novo GUID em Xuplgin.inf, Xuproxy.h e Xusample.rgs.
Crie Uvcxuplgn.def da seguinte maneira:
LIBRARY uvcxuplgn EXPORTS DllGetClassObject PRIVATE DllCanUnloadNow PRIVATE DllRegisterServer PRIVATE DllUnregisterServer PRIVATE
Crie Uvcxuplgn.cpp da seguinte maneira:
#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); }
Crie Stdafx.h da seguinte maneira:
// 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)
Crie Stdafx.cpp da seguinte maneira:
// 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>
Compile o exemplo invocando
Build -cZg
no ambiente de build do WDK.
Confira também
Exemplos de código de unidade de extensão do UVC
Interface de exemplo para unidades de extensão UVC
DLL de plug-in de unidade de extensão de exemplo
Entrada de registro de exemplo para unidades de extensão UVC
Aplicativo de exemplo para unidades de extensão UVC
Suporte a eventos de autenticação automática com unidades de extensão