📄 prot.cpp
字号:
/*********************************************************************
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 + -