⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 prot.cpp

📁 又VC++实现的基于TWAIN的扫描仪图像输入处理软件
💻 CPP
📖 第 1 页 / 共 5 页
字号:
/*********************************************************************
 TWAIN Source code:
*************************************************************************/ 
#include <windows.h>       
#include <stdio.h>
#include <stdlib.h>
#include <memory.h>
#include <string.h>

#include "StdAfx.h"            
#include "twain.h"  

#include "Prot.h"
#include "twd_type.h"       
#include "twd_com.h"        
#include "caps.h"

#include "Wnaspi32.h"
#include "scsidefs.h"

#include "viewWnd.h"
#include "AIEDlg.h"
#include "TitleDlg.h"
#include "Scanningprogress.h"
#include <math.h>
#include <io.h>
#include <direct.h>
#include "dibapi.h"
#include "TitleDlg1.h"
#include "Scanner.h"

#include  "const.h"
#include "testtime.h"

extern CViewWnd* pViewWnd;
extern CScanner* pScanner;
CSetScanner *pSetScanner;

CScanningProgress *pProgress;
CTitleDlg  *pTitleDlg;
Ctesttime  *pTesttime;
/////////
SRB_ExecSCSICmd srbExec;
int gHaid=0, gSCSIID = 0;
////////////////////////
#ifdef WIN32
    #define TW_HUGE
#else
    #define TW_HUGE huge
#endif

#ifndef WIN32
    #define FILE_BEGIN      0
    #define FILE_CURRENT    1
    #define FILE_END        2
#endif

extern UINT TimerOut;
char InitDir2[100];
char InitDir1[8];

BOOL CopyFileEx(char source[],char dest[],BOOL notify);
BOOL SetSourceControl();
void LogMessage(char msg[]);

extern char SourceControl[MAX_TWPATH];    
        
/*应用程序窗口的句柄*/
HWND hAppWnd;             
int DSState= STATE3;       
TW_STATUS    DSStatus;     \

int jiou1[3000]; 

char filename[256];
BOOL FeederEnabled = FALSE;
TW_PALETTE8 hPal;

//控制信息
MAPPER ControlMap[] =
{														
    {DAT_IDENTITY,      &IdentityMsg},      //提出数据源自身的标识信息
    {DAT_USERINTERFACE, InterfaceMsg},		//显示数据源界面的信息
    {DAT_CAPABILITY,    CapabilityMsg},		//设置数据源的属性(比如是否支持数据的JPEG压缩等属性)
    {DAT_STATUS,        StatusMsg},			//状态消息
    {DAT_PENDINGXFERS,  PendingXferMsg},	//描述数据源向应用程序准备好的传输块数目
    {DAT_SETUPMEMXFER,  SetupMemXferMsg},	//设置一次内存缓冲传输所需的参数
    {DAT_SETUPFILEXFER, SetupFileXferMsg},	//设置一次文件传输所需的参数
    {DAT_XFERGROUP,     XferGroupMsg},		//指向下一个要传输的数据块
    // THIS MUST BE LAST
    { 0,                NULL }
};
 
//图象信息
MAPPER ImageMap[] =
{
   {DAT_IMAGEINFO,          ImageInfoMsg},		//设置所要传输图象的信息(比如大小、每象素比特数等)
   {DAT_IMAGELAYOUT,        ImageLayoutMsg},	//描述图象在扫描仪上的格式如大小、位置等
   {DAT_IMAGEMEMXFER,       ImageMemXferMsg},	//实施一次内存缓冲传输
   {DAT_IMAGENATIVEXFER,    ImageNativeXferMsg},//实施一次内存直接传输
   {DAT_IMAGEFILEXFER,      ImageFileXferMsg},	//实施一次磁盘文件传输

   {DAT_PALETTE8,           Palette8Msg},		//数据源报告当前的调色板
   {DAT_GRAYRESPONSE,		GrayResponseMsg},	//数据源利用标志响应转移曲线,此曲线不影响传输的数据
   {DAT_RGBRESPONSE,		RGBResponseMsg},	//数据源转移RGB数据的转移曲线,不影响传输的数据
   {DAT_CIECOLOR,			CIEColorMsg},		//数据源报告数据转换为CIE颜色空间的参数
   {DAT_JPEGCOMPRESSION,	JPEGCompressionMsg},//数据源返回JPEG压缩的参数
   // THIS MUST BE LAST
   {0,                      NULL}
};

/*** Global variables ***/
extern HANDLE          hDSInst;             // Keep track of who we are
extern char            DisplayFileName[80]; // file select by user


/*** Global variables - Source Environment ***/
extern TW_IDENTITY     dsIdentity;          // 数据源标志
extern TW_IDENTITY     appIdentity;         
//为应用程序可识别的数据源的DC INDENTITY结构,数据源填写除ID外的所有数据
//由SM填写其中的ID标志用以标志数据源和应用程序的连接以及他们之间的管理


/*** Global variables - Image Info ***/
HANDLE     hImageDlg;                      //数据源句柄
CSetScanner*	pMainDialog;			   //主对话框

FARPROC     lpfnopenfileLB;


/***********************************************************************
 * FUNCTION: Dispatch 分发函数
 *
 * ARGS:    pTWMsg  通过入口指向消息结构的指针
 *          pMapper 指向包含指针内容的函数
 *          DAT     可供用户选择的标志 
 *
 * RETURNS: 条件代码 
 *
 * NOTES:   通过指向信息结构的指针分发正确的函数,查询函数的过程是通过MAPPER指针
 *			匹配DAT的类型
 *           */
TW_UINT16 Dispatch (PTWMSG pTWMsg, PMAPPER pMapper, TW_UINT16 DAT)
{
    while (pMapper->pFunc != NULL)
    {
        if (pMapper->ID == DAT)
        {
            return(*pMapper->pFunc)(pTWMsg);
        }
        ++pMapper;
    }
    DSStatus.ConditionCode = TWCC_BADPROTOCOL;//条件代码为非法状态
    return (TWRC_FAILURE);
} // Dispatch



/*************************************************************************
 * FUNCTION: IdentityMsg标志消息函数
 * 
 * ARGS:    pTWMsg  消息结构, 作为数据源入口函数的参数
 * 
 * RETURNS: 状态信息
 *
 *
 *NOTES:   句柄分析 : (from DAT_IDENTITY msg's)
 *              - MSG_OPENDS    打开标明的数据源,状态从3到4,STATE4进行属性协商
 *              - MSG_CLOSEDS   关闭标明的数据源
 *              - MSG_GET       获取数据源的结构
 *              - error         出错信息
 *
 */
//标志和出入数据源的操作
TW_UINT16 IdentityMsg	(PTWMSG pTWMsg)
{
    TW_UINT16 twRc = TWRC_SUCCESS;

    switch (pTWMsg->MSG){
        case MSG_OPENDS:
         OpenDS(pTWMsg);//调用函数打开数据源,状态3转移到4
        break;

        case MSG_CLOSEDS:
        CloseDS();		//调用函数关闭数据源,状态4转移到3
        break;

        case MSG_GET:  // tell the SM who you are valid 3--7 states
        *(pTW_IDENTITY)pTWMsg->pData = dsIdentity;
        break;

        default:
        DSStatus.ConditionCode = TWCC_BADPROTOCOL;
        twRc = TWRC_FAILURE;
		//调用函数填写错误信息数组,第一个参数为常量字符串,表明是DAT_IDENTITY中的错误
        DS_Error (E_IDENTITYMSG, DSStatus.ConditionCode);
        break;
   }
   return twRc;
} // IdentityMsg



////////////////////////////////////////////////////////////////////////////
// FUNCTION: InterfaceMsg接口信息
// 
// ARGS:    pTWMsg  是数据源入口函数中的消息参数
// 
// RETURNS: twRC 返回TWAIN状态 
//
// NOTES:   获得的句柄分析: (from DAT_USERINTERFACE msg's)
//              - MSG_ENABLEDS  数据源有效,状态从4到5,STATE5显示UI并准备图象信息
//              - MSG_DISABLEDS 数据源无效
//              - errors        错误信息
//
//从入口函数中的消息实现状态4和5间的转移
TW_UINT16 InterfaceMsg(PTWMSG pTWMsg)
{
    TW_UINT16 twRc = TWRC_SUCCESS;

    switch (pTWMsg->MSG)
    {
        case MSG_ENABLEDS:
            twRc = EnableDS((pTW_USERINTERFACE)pTWMsg->pData);
            break;

        case MSG_DISABLEDS:
            twRc = DisableDS((pTW_USERINTERFACE)pTWMsg->pData);
            break;

        default:
            DSStatus.ConditionCode = TWCC_BADPROTOCOL;//协议出错
            twRc = TWRC_FAILURE;
            DS_Error (E_INTERFACEMSG, DSStatus.ConditionCode);     
            break;
   }
   return twRc;
}  

///////////////////////////////////////////////////////////////////////////////////
// FUNCTION: EnableDS
// 
// ARGS:    pUI 指向用户界面的指针
// 
// RETURNS: twRC 反映TWAIN状态的信息 
//              - TWRC_SUCCESS
//              - TWRC_FAILURE
//                  - TWCC_SEQERROR
//                  - TWCC_LOWMEMORY
// 
// NOTES:   
// COMMENTS:    合法状态为4, 函数执行成功后到状态5,状态4为数据源已被数据源管理器装入并
//				准备接受参数组,此时数据源进行SCSI接口和用户界面的初始化
//              ShowUI bit 1=数据源用户界面; 0=应用程序提供的
//				用户界面为无模式的对话框             
//// 
//转移到状态5,产生用户界面或不能产生时返回错误信息   
TW_UINT16 EnableDS (pTW_USERINTERFACE pUI)
{
    TW_UINT16 twRc = TWRC_SUCCESS;

    if (DSState==STATE4)
    {
       hAppWnd =(struct HWND__ *) pUI->hParent; 


		pMainDialog = new CSetScanner(NULL);
      
		if(pMainDialog->Create(CSetScanner::IDD,NULL))
		//成功地创建了无模式对话框(主对话框),则转移到状态5
		{
			DSState=STATE5;
        }
		else{
		//未能创建,显示错误状态的条件代码
			 DSStatus.ConditionCode=TWCC_LOWMEMORY;
			 twRc=TWRC_FAILURE;
			//第一个参数表明为MSG_ENABLEDS中的错误
			 DS_Error(E_ENABLEDS,DSStatus.ConditionCode);
		}
	}
	else
	{
	     //目前不是状态4,显示状态错误代码
		 DSStatus.ConditionCode = TWCC_SEQERROR;//状态错误
         twRc = TWRC_FAILURE;
         DS_Error (E_ENABLEDS, DSStatus.ConditionCode);
	}//End of if(DSState=STATE4)
	return twRc;
}//End of fn.

///////////////////////////////////////////////////////////////////////////////////
// FUNCTION: DisableDS
//
// ARGS:    pUI    指向用户界面的指针
//
// RETURNS: TWRC_SUCCESS
//          TWRC_FAILURE
//          TWCC_SEQERROR
//
// NOTES:   合法状态为 5 到 7, 如果调用成功则转移到 4.应用程序当数据源发出
//"MSG_CLOSEDSREQ"消息时调用此函数.
//
///////////////////////////////////////////////////////////////////////////////////
TW_UINT16 DisableDS (pTW_USERINTERFACE pUI)
{
    TW_UINT16 twRc = TWRC_SUCCESS;
 
    switch (DSState)
    {
        case STATE5:
        case STATE6:
        case STATE7:
           if (!pUI->ShowUI)
                ShowWindow((struct HWND__ *)hImageDlg, SW_HIDE);
           DSState=STATE4;
           break;
        default:
            DSStatus.ConditionCode = TWCC_SEQERROR;
            twRc = TWRC_FAILURE;
            DS_Error (E_DISABLEDS, DSStatus.ConditionCode);
    }
    return twRc;
} 

/***********************************************************************
 * FUNCTION: OpenDS打开数据源
 *
 * ARGS:    参数为入口函数中的消息
 *
 * RETURNS: 状态代码
 *
 * NOTES:  打开数据源,记录打开数据源的标志为状态从状态3转移到状态4 
 
************************************************************************/
TW_UINT16 OpenDS (PTWMSG pTWMsg)
{
    TW_UINT16 twRc = TWRC_SUCCESS;
    OFSTRUCT of;	//此结构包含OpenFile打开或正在打开的文件的信息
   	OpenFile("c:\\twsrc.log", &of, OF_DELETE);

    GetWindowsDirectory(InitDir2,sizeof(InitDir2));
	lstrcat(InitDir2,"\\twain_32\\MTIScanner\\jiaose.ini"); 

	/*CString	str2;  
    str2=_T("真彩色");
	WritePrivateProfileString("file type", "type", str2, InitDir2);
    
	char str[36];
    int m;
   	m=16777216;
    sprintf(str, "%d", m);
	WritePrivateProfileString("color num", "color", str, InitDir2);*/

	if (DSState==STATE3)
	{
      if (appIdentity.Id)
	  {
        twRc = TWRC_FAILURE;
        DSStatus.ConditionCode = TWCC_MAXCONNECTIONS;
        DS_Error (E_OPENDS, DSStatus.ConditionCode);    
      }
      else 
	  {
        appIdentity = *pTWMsg->pSrc;
        dsIdentity = *(pTW_IDENTITY)pTWMsg->pData;
      }
       DSState = STATE4;
    }
    else
	{
      twRc = TWRC_FAILURE;
      DSStatus.ConditionCode = TWCC_SEQERROR;
      DS_Error (E_OPENDS, DSStatus.ConditionCode);    
    }

   ////////////////////////////////////
    memset( &srbExec, 0, sizeof(SRB_ExecSCSICmd) );
	srbExec.SRB_Cmd = SC_EXEC_SCSI_CMD;
	srbExec.SRB_Flags = SRB_DIR_IN | SRB_EVENT_NOTIFY;
	srbExec.SRB_BufLen = 0; 
	srbExec.SRB_BufPointer =0;
	srbExec.SRB_SenseLen = SENSE_LEN;
	srbExec.SRB_CDBLen = 6;
	srbExec.CDBByte[0] = SCSI_INQUIRY; // =0x12
	srbExec.CDBByte[4] = 36; 

	for(gHaid=0; gHaid < MAX_NUM_HA; gHaid++,gSCSIID = 0)
	{
		srbExec.SRB_HaId = gHaid;

		do{
			srbExec.SRB_Target = gSCSIID; 
			DWORD dwASPIStatus = SendASPI32Command( (LPSRB)&srbExec );
            while(srbExec.SRB_Status==SS_PENDING); 
			if( srbExec.SRB_Status == SS_COMP )
			{
				break;
			}
			gSCSIID++;
		}while(gSCSIID < MAXTARG);

	}
////////////////////////////////////////

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -