📄 testmcro.cpp
字号:
#include "testmcro.h"
#include "wiamicro.h"
#include "resource.h"
#include <STI.H>
#include <math.h>
#include <winioctl.h>
#include <usbscan.h>
#ifdef DEBUG
#include <stdio.h>
#endif
#include <strsafe.h>
// #define BUTTON_SUPPORT // (uncomment this to allow BUTTON SUPPORT)
// button support is not functional in the test device
#define MAX_BUTTONS 1
#define MAX_BUTTON_NAME 255
HINSTANCE g_hInst; // instance of this MicroDriver (used for loading from a resource)
// note: MEMORYBMP, and BMP file will be added by wiafbdrv host driver.
// do not include them in your extended list.
//
// #define _USE_EXTENDED_FORMAT_LIST (uncomment this to allow Extented file and memory formats)
#define NUM_SUPPORTED_FILEFORMATS 1
GUID g_SupportedFileFormats[NUM_SUPPORTED_FILEFORMATS];
#define NUM_SUPPORTED_MEMORYFORMATS 2
GUID g_SupportedMemoryFormats[NUM_SUPPORTED_MEMORYFORMATS];
//
// Button GUID array used in Capability negotiation.
// Set your BUTTON guids here. These must match the GUIDS specified in
// your INF. The Scan Button GUID is public to all scanners with a
// scan button.
//
GUID g_Buttons[MAX_BUTTONS] ={{0xa6c5a715, 0x8c6e, 0x11d2,{ 0x97, 0x7a, 0x0, 0x0, 0xf8, 0x7a, 0x92, 0x6f}}};
BOOL g_bButtonNamesCreated = FALSE;
WCHAR* g_ButtonNames[MAX_BUTTONS] = {0};
INT g_PalIndex = 0; // simple palette index counter (test driver specific)
BOOL g_bDown = FALSE; // simple band direction bool (test drvier specific)
BOOL InitializeScanner(PSCANINFO pScanInfo);
VOID InitScannerDefaults(PSCANINFO pScanInfo);
BOOL SetScannerSettings(PSCANINFO pScanInfo);
VOID CheckButtonStatus(PVAL pValue);
VOID GetButtonPress(LONG *pButtonValue);
HRESULT GetInterruptEvent(PVAL pValue);
LONG GetButtonCount();
HRESULT GetOLESTRResourceString(LONG lResourceID,__deref_out LPOLESTR *ppsz,BOOL bLocal);
VOID ReadRegistryInformation(PVAL pValue);
BOOL APIENTRY DllMain( HANDLE hModule,DWORD dwreason, LPVOID lpReserved)
{
g_hInst = (HINSTANCE)hModule;
switch(dwreason) {
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
/**************************************************************************\
* MicroEntry (MicroDriver Entry point)
*
* Called by the WIA driver to communicate with the MicroDriver.
*
* Arguments:
*
* lCommand - MicroDriver Command, sent from the WIA driver
* pValue - VAL structure used for settings
*
*
* Return Value:
*
* Status
*
* History:
*
* 1/20/2000 Original Version
*
\**************************************************************************/
WIAMICRO_API HRESULT MicroEntry(LONG lCommand, PVAL pValue)
{
HRESULT hr = E_NOTIMPL;
DWORD dwBytesWritten = 0;
INT index = 0;
//#define _DEBUG_COMMANDS
#ifdef _DEBUG_COMMANDS
if(lCommand != CMD_STI_GETSTATUS)
Trace(TEXT("Command Value (%d)"),lCommand);
#endif
if( !pValue || !(pValue->pScanInfo))
{
return E_INVALIDARG;
}
switch(lCommand)
{
case CMD_INITIALIZE:
hr = S_OK;
//
// create any DeviceIO handles needed, use index (1 - MAX_IO_HANDLES) to store these handles.
// Index '0' is reserved by the WIA flatbed driver. The CreateFile Name is stored in the szVal
// member of the VAL structure.
//
// pValue->pScanInfo->DeviceIOHandles[1] = CreateFileA( pValue->szVal,
// GENERIC_READ | GENERIC_WRITE, // Access mask
// 0, // Share mode
// NULL, // SA
// OPEN_EXISTING, // Create disposition
// FILE_ATTRIBUTE_SYSTEM | FILE_FLAG_OVERLAPPED, // Attributes
// NULL );
//
// if your device supports buttons, create the BUTTON name information here..
//
if (!g_bButtonNamesCreated)
{
for(index = 0; index < MAX_BUTTONS; index++)
{
g_ButtonNames[index] = (WCHAR*)CoTaskMemAlloc(MAX_BUTTON_NAME);
if (!g_ButtonNames[index])
{
hr = E_OUTOFMEMORY;
break;
}
}
if(SUCCEEDED(hr))
{
hr = GetOLESTRResourceString(IDS_SCAN_BUTTON_NAME,&g_ButtonNames[0],TRUE);
}
if(SUCCEEDED(hr))
{
g_bButtonNamesCreated = TRUE;
}
else
{
for(index = 0; index < MAX_BUTTONS; index++)
{
if (g_ButtonNames[index])
{
CoTaskMemFree(g_ButtonNames[index]);
g_ButtonNames[index] = NULL;
}
}
}
}
//
// Initialize the scanner's default settings
//
InitScannerDefaults(pValue->pScanInfo);
break;
case CMD_UNINITIALIZE:
//
// close any open handles created by the Micro driver
//
if(pValue->pScanInfo->DeviceIOHandles[1] != NULL)
{
CloseHandle(pValue->pScanInfo->DeviceIOHandles[1]);
}
//
// if your device supports buttons, free/destroy the BUTTON name information here..
//
if(g_bButtonNamesCreated)
{
g_bButtonNamesCreated = FALSE;
for(index = 0; index < MAX_BUTTONS; index++)
{
if (g_ButtonNames[index])
{
CoTaskMemFree(g_ButtonNames[index]);
g_ButtonNames[index] = NULL;
}
}
}
//
// close/unload libraries
//
hr = S_OK;
break;
case CMD_RESETSCANNER:
//
// reset scanner
//
hr = S_OK;
break;
case CMD_STI_DIAGNOSTIC:
case CMD_STI_DEVICERESET:
//
// reset device
//
hr = S_OK;
break;
case CMD_STI_GETSTATUS:
//
// set status flag to ON-LINE
//
pValue->lVal = MCRO_STATUS_OK;
pValue->pGuid = (GUID*) &GUID_NULL;
//
// button polling support
//
#ifdef BUTTON_SUPPORT
CheckButtonStatus(pValue);
#endif
hr = S_OK;
break;
case CMD_SETXRESOLUTION:
pValue->pScanInfo->Xresolution = pValue->lVal;
hr = S_OK;
break;
case CMD_SETYRESOLUTION:
pValue->pScanInfo->Yresolution = pValue->lVal;
hr = S_OK;
break;
case CMD_SETCONTRAST:
pValue->pScanInfo->Contrast = pValue->lVal;
hr = S_OK;
break;
case CMD_SETINTENSITY:
pValue->pScanInfo->Intensity = pValue->lVal;
hr = S_OK;
break;
case CMD_SETDATATYPE:
pValue->pScanInfo->DataType = pValue->lVal;
hr = S_OK;
break;
case CMD_SETNEGATIVE:
pValue->pScanInfo->Negative = pValue->lVal;
hr = S_OK;
break;
case CMD_GETADFSTATUS:
case CMD_GETADFHASPAPER:
// pValue->lVal = MCRO_ERROR_PAPER_EMPTY;
// hr = S_OK;
break;
case CMD_GET_INTERRUPT_EVENT:
hr = GetInterruptEvent(pValue);
break;
case CMD_GETCAPABILITIES:
pValue->lVal = 0;
pValue->pGuid = NULL;
pValue->ppButtonNames = NULL;
hr = S_OK;
break;
case CMD_SETSCANMODE:
hr = S_OK;
switch(pValue->lVal)
{
case SCANMODE_FINALSCAN:
Trace(TEXT("Final Scan"));
break;
case SCANMODE_PREVIEWSCAN:
Trace(TEXT("Preview Scan"));
break;
default:
Trace(TEXT("Unknown Scan Mode (%d)"),pValue->lVal);
hr = E_FAIL;
break;
}
break;
case CMD_SETSTIDEVICEHKEY:
ReadRegistryInformation(pValue);
break;
#ifdef _USE_EXTENDED_FORMAT_LIST
// note: MEMORYBMP, and BMP file will be added by wiafbdrv host driver.
// do not include them in your extended list.
//
case CMD_GETSUPPORTEDFILEFORMATS:
g_SupportedFileFormats[0] = WiaImgFmt_JPEG;
pValue->lVal = NUM_SUPPORTED_FILEFORMATS;
pValue->pGuid = g_SupportedFileFormats;
hr = S_OK;
break;
case CMD_GETSUPPORTEDMEMORYFORMATS:
g_SupportedMemoryFormats[0] = WiaImgFmt_TIFF;
g_SupportedMemoryFormats[1] = WiaImgFmt_MYNEWFORMAT;
pValue->lVal = NUM_SUPPORTED_MEMORYFORMATS;
pValue->pGuid = g_SupportedMemoryFormats;
hr = S_OK;
break;
#endif
default:
Trace(TEXT("Unknown Command (%d)"),lCommand);
break;
}
return hr;
}
/**************************************************************************\
* Scan (MicroDriver Entry point)
*
* Called by the WIA driver to acquire data from the MicroDriver.
*
* Arguments:
*
* pScanInfo - SCANINFO structure used for settings
* lPhase - Current Scan phase, SCAN_FIRST, SCAN_NEXT, SCAN_FINISH...
* pBuffer - data buffer to be filled with scanned data
* lLength - Maximum length of pBuffer
* plReceived - Number of actual bytes written to pBuffer.
*
*
* Return Value:
*
* Status
*
* History:
*
* 1/20/2000 Original Version
*
\**************************************************************************/
WIAMICRO_API HRESULT Scan(PSCANINFO pScanInfo, LONG lPhase, PBYTE pBuffer, LONG lLength, LONG *plReceived)
{
if(pScanInfo == NULL) {
return E_INVALIDARG;
}
INT i = 0;
Trace(TEXT("------ Scan Requesting %d ------"),lLength);
switch (lPhase) {
case SCAN_FIRST:
if (!SetScannerSettings(pScanInfo)) {
return E_FAIL;
}
Trace(TEXT("SCAN_FIRST"));
g_PalIndex = 0;
g_bDown = FALSE;
//
// first phase
//
Trace(TEXT("Start Scan.."));
case SCAN_NEXT: // SCAN_FIRST will fall through to SCAN_NEXT (because it is expecting data)
//
// next phase
//
if(lPhase == SCAN_NEXT)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -