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:

  1. 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
  2. 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

    Fornecendo um arquivo INF UVC

  3. 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
    
  4. 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
    
  5. 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.
  6. Crie Uvcxuplgn.def da seguinte maneira:

    LIBRARY uvcxuplgn
    
    EXPORTS
        DllGetClassObject   PRIVATE
        DllCanUnloadNow     PRIVATE
        DllRegisterServer   PRIVATE
        DllUnregisterServer PRIVATE
    
  7. 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);
    }
    
  8. 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)
    
  9. 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>
    
  10. 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

Fornecendo um arquivo INF UVC