读卡器控件读卡操作问题

leon_miao 2012-08-03 03:35:18
最近在做一个读取2代身份证的功能,是通过B/S方式来实现
用JAVASCRIPT 调用OCX控件来完成刷卡操作
由于是刚接触连接设备这种开发,现在VC开发的控件能够正常调用 但是无法读取卡信息
请大家帮忙看看
以下是控件的一些基本方法信息

/////////////////////////////////////////////////////////////////////////////
// CHMiDR200Ctrl message handlers
/*!****************************************************
函数名称:InitComm
函数功能:初始化端口
函数类型:short
输入参数:
输出参数:short
返回值: short 0--成功, -1 --失败
****************************************************!*/
short CHMiDR200Ctrl::InitComm()
{
/* if(m_bInit == TRUE)
{
WriteParseLog(__FILE__,__LINE__,"%s","已经初始过不再重新初始");
if(m_bCancelRead == FALSE)
{
m_bCancelRead = TRUE;//???????
Sleep(100);//20110809
}

return CARD_2ND_INIT_COMM_SUCCEED;
}
int nUSBPort;
BOOL flag = FALSE;

for(nUSBPort = 1001; nUSBPort <= 1016; nUSBPort++)
{
if(CVR_InitComm(nUSBPort) == 1)
{
flag = true;
break;
}
}
m_bInit = flag;
m_bCancelRead = FALSE;
if(m_bInit)
{
WriteParseLog(__FILE__,__LINE__,"%s","打开端口成功");
return CARD_2ND_INIT_COMM_SUCCEED ;
}else{
WriteParseLog(__FILE__,__LINE__,"%s","打开端口失败");
return CARD_2ND_INIT_COMM_FAIL;
}
*/
m_bInit = TRUE;
m_bCancelRead = FALSE;
return CARD_2ND_INIT_COMM_SUCCEED ;
}


/*!****************************************************
函数名称:ReadCard
函数功能:读卡信息
函数类型:short
输入参数:
输出参数:short
返回值: short 成功, 失败
****************************************************!*/
short CHMiDR200Ctrl::ReadCard()
{
if(m_bInit == FALSE)
{
WriteParseLog(__FILE__,__LINE__,"%s","读卡前未初始化设备,另行初始化");
InitComm();
if(m_bInit == FALSE)
{
WriteParseLog(__FILE__,__LINE__,"%s","读卡前初始化设备失败");
return CARD_2ND_READ_FAIL;
}
}

if(NULL != m_hThreadReadProc)
{
WriteParseLog(__FILE__,__LINE__,"%s","启动前,发现线程句柄非空,");
if(WAIT_TIMEOUT == WaitForSingleObject(m_hThreadReadProc, 10))
{
WriteParseLog(__FILE__,__LINE__,"%s","正在读取身份证信息,重复读取失败");
return CARD_2ND_READ_FAIL;
}
else
{
m_bCancelRead = TRUE;//20110809
Sleep(200);//20110809
CloseHandle(m_hThreadReadProc);
m_hThreadReadProc = NULL;
}
}
//
memset(&m_acard,0x00,sizeof(m_acard));

m_hThreadReadProc = CreateThread(NULL, 0, ThreadReadProc, this, 0,0);
if (!m_hThreadReadProc)
{
WriteParseLog(__FILE__,__LINE__,"%s","ReadCard() :启动线程失败,,,");
return CARD_2ND_READ_FAIL;
}
return CARD_2ND_READ_SUCCEED;
}
//-------------------------------------------------------------------------------------------------------
DWORD CHMiDR200Ctrl::ThreadReadProc(LPVOID pParam)
{
CHMiDR200Ctrl *pCtrl = (CHMiDR200Ctrl*)pParam;
if(NULL == pCtrl)
{
WriteParseLog(__FILE__,__LINE__,"%s","二代证扫描仪控件为空!");
::PostMessage(pCtrl->m_hWndMsg, WM_NEWDEVICEERR, (WPARAM)NULL, (LPARAM)NULL);
return 0;
}
WriteParseLog(__FILE__,__LINE__,"%s","调用线程函数,");
pCtrl->ReadProc();

return 0;
}


void CHMiDR200Ctrl::ReadProc()
{
//WriteParseLog(__FILE__,__LINE__,"%s","进入ReadProc");
m_bCancelRead = FALSE;

m_sDeviceStatus = CARD_2ND_STATUS_BUSY;

int nUSBPort;
BOOL flag = FALSE;

for(nUSBPort = 1001; nUSBPort <= 1016; nUSBPort++)
{
if(CVR_InitComm(nUSBPort) == 1)
{
flag = TRUE;
break;
}
}
if(m_bInit)
{
WriteParseLog(__FILE__,__LINE__,"%s","打开端口成功");
// return CARD_2ND_INIT_COMM_SUCCEED ;
}else{
WriteParseLog(__FILE__,__LINE__,"%s","打开端口失败");
return ;
}

//check card status
while(!m_bCancelRead)
{
if(m_bCancelRead == TRUE)
{
WriteParseLog(__FILE__,__LINE__,"%s","m_bCancelRead为真,取消读卡");
//::PostMessage(m_hWndMsg, WM_NEWDEVICEERR, (WPARAM)NULL, (LPARAM)NULL);//zhangli 20110809 ***************
m_bCancelRead = FALSE;//20110809
return;
}
if(CVR_Authenticate()==1)
{

m_bCancelRead = TRUE;
WriteParseLog(__FILE__,__LINE__,"%s","while循环等待放卡");
//Read RFID
memset(&m_acard,0,sizeof(m_acard));
/*
unsigned char textInfo[256];
unsigned int nTextLen = 256;
unsigned int nPhotoLen = 1024;
*/

//if(CVR_ReadBaseMsg(textInfo, &nTextLen,m_acard.id_pImage, &nPhotoLen , 4))
if(1==CVR_Read_Content(1))
{
int nbufLen;
nbufLen = sizeof(m_acard.id_Code);
GetPeopleIDCode(m_acard.id_Code, &nbufLen);

nbufLen = sizeof(m_acard.id_Name);
GetPeopleName(m_acard.id_Name, &nbufLen);

nbufLen = sizeof(m_acard.id_Sex);
GetPeopleSex(m_acard.id_Sex, &nbufLen);

nbufLen = sizeof(m_acard.id_National);
GetPeopleNation(m_acard.id_National, &nbufLen);

nbufLen = sizeof(m_acard.id_Born);
GetPeopleBirthday(m_acard.id_Born, &nbufLen);

nbufLen = sizeof(m_acard.id_Home);
GetPeopleAddress(m_acard.id_Home, &nbufLen);

nbufLen = sizeof(m_acard.id_ValidPeriod_Start );
GetStartDate(m_acard.id_ValidPeriod_Start, &nbufLen);

nbufLen = sizeof(m_acard.id_ValidPeriod_End);
GetEndDate(m_acard.id_ValidPeriod_End, &nbufLen);

nbufLen = sizeof(m_acard.id_RegOrg );
GetPeopleDepartment(m_acard.id_RegOrg, &nbufLen);

char Photo1[1024];
char Photo2[1024];
strcpy(Photo1,m_cPathName);
strcat(Photo1,"\\");
strcat(Photo1,m_acard.id_Code);
strcpy(Photo2,Photo1);
strcat(Photo1,"_No2.bmp");
strcat(Photo2,"_No2.jpg");
CopyFile("zp.bmp",Photo1,FALSE);
CxImage Image;
Image.Load(Photo1,CXIMAGE_FORMAT_BMP);
Image.Save(Photo2,CXIMAGE_FORMAT_JPG);
m_sDeviceStatus = CARD_2ND_STATUS_OK;
::PostMessage(m_hWndMsg, WM_THREADREADEVENT, (WPARAM)NULL, (LPARAM)NULL);
WriteParseLog(__FILE__,__LINE__,"%s","CVR_Read_Content读卡成功");
} else {
//读卡失败
WriteParseLog(__FILE__,__LINE__,"%s","CVR_Read_Content读卡失败");
}
}

Sleep(500);
} //while循环结束
CVR_CloseComm();
}



调用InitComm()方法进行初始化后 调用ReadCard()方法 不管有没有卡都读不到信息
现在觉得疑惑的是ReadCard()返回的是一个数字 我如何在网页中通过JAVASCRIPT去取得这些读卡信息呢
读卡之后这些卡信息是怎么处理的

以下是网页中的测试调用 GETNAME等方法都是控件内的方法

<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<object name="SID" id="SID" classid="CLSID:6321D4CA-BED3-483D-886D-91E1910B28DA" style="visibility: hidden;" ></object>

<input type="button" name="btn_open" value="开启" onclick="fc_open()" />

<input type="button" name="btn_close" value="关闭" onclick="fc_close()" />

<input type="button" name="btn_read" value="读卡" onclick="fc_read()" />
</body>

<script type="text/javascript">
function fc_open(){
var initNum=SID.InitComm();
alert(initNum);
SID.ReadProc();
}


function fc_close(){
SID.CancelComm();
SID.CloseComm();

}

function fc_read(){
var readNum= SID.ReadCard();
alert("a"+readNum+"b");
if(readNum==0){
alert("name"+SID.GetName());
alert("id"+SID.GetNumber());
alert("sex"+SID.GetSex());
alert("addr"+SID.GetAddress());
alert("people"+SID.GetPeople());
alert("birth"+SID.GetBirthday());
alert("dept"+SID.GetDepartment());
}else{
alert("读卡失败");
}
}
</script>

调用后读取不到任何信息
本人新手 还请大家多多指教
...全文
477 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
  • 打赏
  • 举报
回复
没有接触过,路过
leon_miao 2012-08-04
  • 打赏
  • 举报
回复
哪位有经验的大虾帮帮忙呀

67,513

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧