|
|
/*******************************************************************************
* * (C) COPYRIGHT 2000, MICROSOFT CORP. * * TITLE: CCamMicro.cpp * * VERSION: 1.0 * * DATE: Dec 13, 2000 * * DESCRIPTION: * Implementation of a simple class that wraps a camera microdriver DLL. * This class loads the DLL and retrieves the address for the exported * functions. * *******************************************************************************/
#include "pch.h"
//
// These macros make it easier to wrap the DLL functions
//
#define GET_PROC_ADDRESS(fn) \
m_p ## fn = (FP ## fn) GetProcAddress(m_hModule, "WiaMCam" #fn); \ REQUIRE_FILEIO(m_p ## fn != NULL, hr, "Init", "GetProcAddress failed on WiaMCam" #fn);
#define CALL_DLL_FUNCTION(fn, parm) \
HRESULT hr = S_OK; \ if (m_p ## fn) { \ hr = m_p ## fn ## parm; \ } \ else { \ wiauDbgError("CCamMicro::" #fn, "m_p" #fn " not initialized"); \ hr = E_FAIL; \ } \ return hr;
//
// Implementation of DLL wrapper
//
CCamMicro::CCamMicro() : m_hModule(NULL), m_pInit(NULL), m_pUnInit(NULL), m_pOpen(NULL), m_pClose(NULL), m_pGetDeviceInfo(NULL), m_pReadEvent(NULL), m_pStopEvents(NULL), m_pGetItemInfo(NULL), m_pFreeItemInfo(NULL), m_pGetThumbnail(NULL), m_pGetItemData(NULL), m_pDeleteItem(NULL), m_pSetItemProt(NULL), m_pTakePicture(NULL), m_pStatus(NULL), m_pReset(NULL) { }
CCamMicro::~CCamMicro() { if (m_hModule != NULL) { FreeLibrary(m_hModule); } }
HRESULT CCamMicro::Init(PTSTR ptszMicroDriverName, MCAM_DEVICE_INFO **ppDeviceInfo) { DBG_FN("CCamMicro::CCamMicro");
HRESULT hr = S_OK;
//
// Load the camera microdriver
//
m_hModule = LoadLibrary(ptszMicroDriverName); REQUIRE_FILEHANDLE(m_hModule, hr, "CCamMicro::CCamMicro", "LoadLibrary failed");
GET_PROC_ADDRESS(Init); GET_PROC_ADDRESS(UnInit); GET_PROC_ADDRESS(Open); GET_PROC_ADDRESS(Close); GET_PROC_ADDRESS(GetDeviceInfo); GET_PROC_ADDRESS(ReadEvent); GET_PROC_ADDRESS(StopEvents); GET_PROC_ADDRESS(GetItemInfo); GET_PROC_ADDRESS(FreeItemInfo); GET_PROC_ADDRESS(GetThumbnail); GET_PROC_ADDRESS(GetItemData); GET_PROC_ADDRESS(DeleteItem); GET_PROC_ADDRESS(SetItemProt); GET_PROC_ADDRESS(TakePicture); GET_PROC_ADDRESS(Status); GET_PROC_ADDRESS(Reset);
if (m_pInit) { hr = m_pInit(ppDeviceInfo); } else { wiauDbgError("CCamMicro::Init", "m_pInit not initialized"); hr = E_FAIL; }
Cleanup: return hr; }
HRESULT CCamMicro::UnInit(MCAM_DEVICE_INFO *pDeviceInfo) { CALL_DLL_FUNCTION(UnInit, (pDeviceInfo)); }
HRESULT CCamMicro::Open(MCAM_DEVICE_INFO *pDeviceInfo, PWSTR pwszPortName) { CALL_DLL_FUNCTION(Open, (pDeviceInfo, pwszPortName)); }
HRESULT CCamMicro::Close(MCAM_DEVICE_INFO *pDeviceInfo) { CALL_DLL_FUNCTION(Close, (pDeviceInfo)); }
HRESULT CCamMicro::GetDeviceInfo(MCAM_DEVICE_INFO *pDeviceInfo, MCAM_ITEM_INFO **ppItemList) { CALL_DLL_FUNCTION(GetDeviceInfo, (pDeviceInfo, ppItemList)); }
HRESULT CCamMicro::ReadEvent(MCAM_DEVICE_INFO *pDeviceInfo, MCAM_EVENT_INFO **ppEventList) { CALL_DLL_FUNCTION(ReadEvent, (pDeviceInfo, ppEventList)); }
HRESULT CCamMicro::StopEvents(MCAM_DEVICE_INFO *pDeviceInfo) { CALL_DLL_FUNCTION(StopEvents, (pDeviceInfo)); }
HRESULT CCamMicro::GetItemInfo(MCAM_DEVICE_INFO *pDeviceInfo, MCAM_ITEM_INFO *pItemInfo) { CALL_DLL_FUNCTION(GetItemInfo, (pDeviceInfo, pItemInfo)); }
HRESULT CCamMicro::FreeItemInfo(MCAM_DEVICE_INFO *pDeviceInfo, MCAM_ITEM_INFO *pItemInfo) { CALL_DLL_FUNCTION(FreeItemInfo, (pDeviceInfo, pItemInfo)); }
HRESULT CCamMicro::GetThumbnail(MCAM_DEVICE_INFO *pDeviceInfo, MCAM_ITEM_INFO *pItem, INT *pThumbSize, BYTE **ppThumb) { CALL_DLL_FUNCTION(GetThumbnail, (pDeviceInfo, pItem, pThumbSize, ppThumb)); }
HRESULT CCamMicro::GetItemData(MCAM_DEVICE_INFO *pDeviceInfo, MCAM_ITEM_INFO *pItem, UINT uiState, BYTE *pBuf, DWORD dwLength) { CALL_DLL_FUNCTION(GetItemData, (pDeviceInfo, pItem, uiState, pBuf, dwLength)); }
HRESULT CCamMicro::DeleteItem(MCAM_DEVICE_INFO *pDeviceInfo, MCAM_ITEM_INFO *pItem) { CALL_DLL_FUNCTION(DeleteItem, (pDeviceInfo, pItem)); }
HRESULT CCamMicro::SetItemProt(MCAM_DEVICE_INFO *pDeviceInfo, MCAM_ITEM_INFO *pItem, BOOL bReadOnly) { CALL_DLL_FUNCTION(SetItemProt, (pDeviceInfo, pItem, bReadOnly)); }
HRESULT CCamMicro::TakePicture(MCAM_DEVICE_INFO *pDeviceInfo, MCAM_ITEM_INFO **ppItemInfo) { CALL_DLL_FUNCTION(TakePicture, (pDeviceInfo, ppItemInfo)); }
HRESULT CCamMicro::Status(MCAM_DEVICE_INFO *pDeviceInfo) { CALL_DLL_FUNCTION(Status, (pDeviceInfo)); }
HRESULT CCamMicro::Reset(MCAM_DEVICE_INFO *pDeviceInfo) { CALL_DLL_FUNCTION(Reset, (pDeviceInfo)); }
|