Поделиться через


Создание примера элемента управления "Модуль расширения"

Важно!

Содержимое и пример кода в этом разделе устарели и в настоящее время не поддерживаются. Он может не работать с текущей цепочкой инструментов разработки драйверов.

Вы можете скомпилировать код, приведенный в этом разделе, для создания примера элемента управления расширения UVC. При сборке этого проекта создается элемент управления Microsoft ActiveX, который можно использовать с соответствующим приложением для получения и задания свойств в модуле расширения.

Для использования элемента управления требуется оборудование, реализующее определенные функциональные возможности модуля расширения. Кроме того, можно использовать ЭМУЛЯТОР USB.

Чтобы создать элемент управления, выполните следующие действия:

  1. Установите следующие пакеты:

    • Пакет средств разработки драйверов Microsoft Windows Server 2003 с пакетом обновления 1 (SP1)
    • Обновление пакета SDK для Microsoft DirectX 9.0 (февраль 2005 г.)
    • Дополнительные возможности пакета SDK для Microsoft DirectX 9.0 за февраль 2005 г.
  2. Скопируйте пример кода из следующих разделов в отдельные файлы.

    Пример интерфейса для единиц расширения UVC

    Пример подключаемого модуля расширения DLL

    Пример записи реестра для единиц расширения UVC

    Пример приложения для единиц расширения UVC

    Поддержка событий автоматического обновления с помощью единиц расширения

    Предоставление INF-файла UVC

  3. Создайте исходный файл следующим образом:

    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. Создайте файл 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
    
  5. Используйте средство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.
  6. Создайте Uvcxuplgn.def следующим образом:

    LIBRARY uvcxuplgn
    
    EXPORTS
        DllGetClassObject   PRIVATE
        DllCanUnloadNow     PRIVATE
        DllRegisterServer   PRIVATE
        DllUnregisterServer PRIVATE
    
  7. Создайте 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);
    }
    
  8. Создайте 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)
    
  9. Создайте 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>
    
  10. Выполните сборку примера, Build -cZg вызвав в среде сборки WDK.

См. также раздел

Примеры кода модуля расширения UVC

Пример интерфейса для единиц расширения UVC

Пример подключаемого модуля расширения DLL

Пример записи реестра для единиц расширения UVC

Пример приложения для единиц расширения UVC

Поддержка событий автоматического обновления с помощью единиц расширения

Предоставление INF-файла UVC