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

📄 kdcardctl.cpp

📁 磁卡读写器编程
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	{
		SetEvent(hKillThread);
		TraceDebug("关闭控件CloseDevice,发送退出线程信号:", mThreadRunning);            //可能会出现弹卡失败,从此退出程序,却没关串口
	}

    if(FinishThreadFlag == 1)
	{
		if(WaitForSingleObject(hFinishThread, 4000) == WAIT_TIMEOUT)
		{
			TraceDebug("强迫杀死事件!", 0);            //可能会出现弹卡失败,从此退出程序,却没关串口
			TerminateThread(threadHandle,0L);
		}
    } 
	else
	{
		if(mThreadRunning==1)
		{
			if(WaitForSingleObject(hFinishThread, 4000) == WAIT_TIMEOUT)
			{
				TraceDebug("强迫杀死事件!", 0);            //11月21日改,可能会出现弹卡失败,从此退出程序,却没关串口
				TerminateThread(threadHandle,0L);
			}
		}
		else
		{
			TraceDebug("线程未完全启动!", 0);    
			TerminateThread(threadHandle, 0L);
		}
	}

	mThreadRunning = 0;

	if(NULL != threadHandle)
	{
	   CloseHandle(threadHandle);
	   threadHandle = NULL;
	}
	
	pCom->KD6006.gCom.AsynClose();

	ret=pCom->kde4787.EjectCard(0);
	pCom->InitingKDE = 0;
	mDeviceCloseing = 1;
	TraceDebug("关闭控件CloseDevice,退卡返回值:", ret);            //可能会出现弹卡失败,从此退出程序,却没关串口

	return 0;
}

short CKDCARDCtrl::GetDeviceStatus() 
{
	// TODO: Add your property handler here

	return  pCom->mDeviceType;
}

void CKDCARDCtrl::SetDeviceStatus(short nNewValue) 
{
	// TODO: Add your property handler here

	SetModifiedFlag();
}

short CKDCARDCtrl::EjectCardKDE() 
{
	// TODO: Add your dispatch handler code here
    if(mThreadRunning == 1)
	{
		SetEvent(hKillThread);
	}

	pCom->KD6006.gCom.AsynClose();
	TraceDebug("ZT606 Close Com Ok", 0);

	pCom->kde4787.EjectCard(0);
	pCom->InitingKDE = 0;
	return 0;
}

short CKDCARDCtrl::GetExtPortKD6006() 
{
	// TODO: Add your property handler here
	return 0;
}

void CKDCARDCtrl::SetExtPortKD6006(short nNewValue) 
{
	// TODO: Add your property handler here
	pCom->KD6006.zSetExtPort(nNewValue);
	SetModifiedFlag();
}

short CKDCARDCtrl::GetExtPortKDE() 
{
	// TODO: Add your property handler here
	return 0;
}

void CKDCARDCtrl::SetExtPortKDE(short nNewValue) 
{
	// TODO: Add your property handler here

	pCom->kde4787.zSetExtPort(nNewValue);
	SetModifiedFlag();
}

short CKDCARDCtrl::GetPortFromIni() 
{
	// TODO: Add your dispatch handler code here
	short nPort;
	nPort = GetPrivateProfileInt("KDE4787","SerialPort", 0, "KDDEV.INI");
	pCom->kde4787.zSetPort(nPort);

	nPort = GetPrivateProfileInt("KDE4787","ExtPort", 0, "KDDEV.INI");
	pCom->kde4787.zSetExtPort(nPort);


	nPort = GetPrivateProfileInt("KD6006","SerialPort", 0, "KDDEV.INI");
	pCom->KD6006.zSetPort(nPort);

	nPort = GetPrivateProfileInt("KD6006","ExtPort", 0, "KDDEV.INI");
	pCom->KD6006.zSetExtPort(nPort);
	return 0;
}

short CKDCARDCtrl::SendICC(LPCTSTR pchSendBuf, LPCTSTR pchRcvBuf, LPCTSTR pchICSW) 
{
	// TODO: Add your dispatch handler code here
    return pCom->kde4787.SendICCommand((char *)pchSendBuf, (char *)pchRcvBuf, (char *)pchICSW);

}



short CKDCARDCtrl::GetSerialPortKD6006() 
{
	// TODO: Add your property handler here
	return pCom->KD6006.mSerialPort;
}

void CKDCARDCtrl::SetSerialPortKD6006(short nNewValue) 
{
	// TODO: Add your property handler here

	pCom->KD6006.zSetPort(nNewValue);
	SetModifiedFlag();
}

short CKDCARDCtrl::GetSerialPortKDE() 
{
	// TODO: Add your property handler here
	return pCom->kde4787.mSerialPort;
}

void CKDCARDCtrl::SetSerialPortKDE(short nNewValue) 
{
	// TODO: Add your property handler here
	pCom->kde4787.zSetPort(nNewValue);
	SetModifiedFlag();
}

short CKDCARDCtrl::TakeBackCard() 
{
	// TODO: Add your dispatch handler code here
	pCom->kde4787.EjectCard(1);
	return 0;
}

BSTR CKDCARDCtrl::GetTrack2() 
{
	CString strResult;
	// TODO: Add your property handler here
    strResult = pCom->chTrack2;
	return strResult.AllocSysString();
}

void CKDCARDCtrl::SetTrack2(LPCTSTR lpszNewValue) 
{
	// TODO: Add your property handler here

	SetModifiedFlag();
}

BSTR CKDCARDCtrl::GetTrack3() 
{
	CString strResult;
	// TODO: Add your property handler here
	strResult = pCom->chTrack3;
	return strResult.AllocSysString();
}

void CKDCARDCtrl::SetTrack3(LPCTSTR lpszNewValue) 
{
	// TODO: Add your property handler here

	SetModifiedFlag();
}

short CKDCARDCtrl::WaittingCard(short Mode) 
{
	// TODO: Add your dispatch handler code here
	DWORD dwID;
    int  ret=-2;  

	TraceDebug("正在创建线程,开始WaittingCard...", 0);
	//ICFlag是判别是否是IC卡
	ICFlag = Mode;
    if(mThreadRunning==1)
	{
		TerminateThread(threadHandle,0L);
		CloseHandle(threadHandle);
		threadHandle = NULL;
        
	    mThreadRunning=0;
	}

//	char  KDEInfo[80];
/*
	ret = pCom->KD6006.gOpenKD606Com();
    if(ret)
	{
		pCom->KD6006.gCom.AsynClose();
		memset(KDEInfo, '\0', 80);
		sprintf(KDEInfo, "Open Zt606 COM error return=%d", ret);
		TraceDebug(KDEInfo, 0);
		TraceDebug("异常:Open Zt606COM error!未创建线程", 0);
		return -2;
	}
*/
	threadHandle = CreateThread(NULL,NULL,              //创建线程
				(LPTHREAD_START_ROUTINE)ThreadProc,
				(LPVOID)this,
				NULL,
				&dwID);

	if(!threadHandle)
	{
		TraceDebug("异常:创建线程失败Create Thread Fail!", 0);       //创建失败时取错误码    
		return -1;
	}

	mDeviceCloseing = 0;
	TraceDebug("创建线程成功------★★『『『『", 0);       //创建失败时取错误码    

    return 0;
}

LONG ThreadCheckProc(LPVOID pParam)
{
	CKDCARDCtrl *pCtrl = (CKDCARDCtrl*)pParam;
	unsigned long TimeOld,TimeCurr;

    TimeCurr = GetTickCount();
	TimeOld = pCtrl->TimeOut*1000;

	while(1)
	{
		if(GetTickCount()-TimeCurr>TimeOld)
		{
			pCtrl->pCom->kde4787.EjectCard(1);
			break;
		}
		Sleep(1000);
	} // end while
	PostMessage(pCtrl->hWndMsg ,WM_THREADTAKECARDEVENT,(WPARAM)NULL,(LPARAM)NULL);

	pCtrl->mThreadCheckRun = 0;
	return TRUE;
}

LONG ThreadProc(LPVOID pParam)
{
	CKDCARDCtrl *pCtrl = (CKDCARDCtrl*)pParam;
	short ret, ret1=0, ret2=-1;
	int   checktimes = 3;

    pCtrl->pCom->mDeviceType = _DEV_NONE;

	TraceDebug("线程中:开始运行------★★ 22222", 0);

	ret2 = pCtrl->pCom->InitKDE4787();

	if(ret2)
	{
		char KDEInfo[128];
		memset(KDEInfo, '\0', 80);
		sprintf(KDEInfo, "Open KDE COM error return=%d", ret2);
		TraceDebug(KDEInfo, 0);
		TraceDebug("线程中:异常:线程中读卡器Open KDE COM error!,只能手动刷卡", 0);
	}

	TraceDebug("Waitting Card OK",0);

    pCtrl->mThreadRunning = 1;
	TraceDebug("线程中:线程启动正常", 0);

    ret = pCtrl->pCom->kde4787.KDMEnable(2);
	TraceDebug("kdmenable return", ret);
	ret = pCtrl->pCom->kde4787.KDM_EntryCard(0);
	TraceDebug("kdm entry card return", ret);

/*	if(ret == _KDE_CARD_INSIDE)
    {
	    ret1 = kde4787.IcCardPower(1, ATR);
	    if(ret1 >= _DEV_OK)
	        mDeviceType = _DEV_KDE4787_OK;
	}
	else if(ret == _KDE_CARD_ATGATE)
	{
    	ret1 = kde4787.KDM_EntryCard(2);
		if(ret1 == _KDE_CARD_INSIDE)
        {
		    ret1 = kde4787.IcCardPower(1, ATR);
		    if(ret1 >= _DEV_OK)
			{
		        mDeviceType = _DEV_KDE4787_OK;
			}
		}
	}
	else 
	{
		mDeviceType = _DEV_KDE4787_ERR;
	}

*/
	while(checktimes)   
	{
		if(WaitForSingleObject(pCtrl->hKillThread, 300) == WAIT_OBJECT_0)
		{
			TraceDebug("线程中:收到信号通知,无刷卡,正常退出,★★』』』』』!", 0);
			pCtrl->mThreadRunning = 0;
			SetEvent(pCtrl->hFinishThread);

			pCtrl->FinishThreadFlag = 1;
			TraceDebug("Set Event hFinishTHread OK!", 0);

			return FALSE;
		}
/*
		if(ret1==0)
		{
			ret = pCtrl->pCom->CheckKD6006(23);
			if(ret == _OK_RCV)
			{
				pCtrl->pCom->KD6006.gCom.AsynClose();
				break;
			}
		}
*/
		Sleep((DWORD)100);
		if(ret2==0)
		{
			TraceDebug("ret2 is 0!", 0);
			if(pCtrl->ICFlag!=1)
			{
				TraceDebug("ic flag is not 0!", 0);

				ret = pCtrl->pCom->CheckKDE4787();
				if(ret == _DEV_OK)
				{
//					pCtrl->pCom->KD6006.gCom.AsynClose();
					break;
				}
				if( ret == _ERR_KDE_MAGREAD1)
					checktimes-- ;
				TraceDebug("checkkde4787 return:", ret);
			}
			else
			{
				TraceDebug("ic flag is 0!", 0);
				Sleep((DWORD)50);
				ret = pCtrl->pCom->CheckICKDE4787();
				if(ret == _KDE_CARD_INSIDE)
				{
					break;
				}
			}
		}

	} // end while
	if(checktimes == 0)
	{
//		Sleep((DWORD)10000);
//		pCtrl->pCom->mDeviceType = _DEV_KDE4787_ERR;
		TraceDebug("线程中:线程收到刷卡,但读卡错误!", 0);
	}
	else
	{
		TraceDebug("线程中:线程收到刷卡,正常退出,★★』』』』", 0);
	}

	PostMessage(pCtrl->hWndMsg ,WM_THREADFIREEVENT,(WPARAM)NULL,(LPARAM)NULL);
	pCtrl->mThreadRunning = 0;

    SetEvent(pCtrl->hFinishThread);
    pCtrl->FinishThreadFlag = 1;
/*	if(checktimes == 0)
	{
		Sleep((DWORD)100);
		pCtrl->pCom->kde4787.EjectCard(0);
		TraceDebug("三次读卡不成功, 退卡!", 0);
	}
*/	return TRUE;
}

void CKDCARDCtrl::FireClassEvent()
{
	FireCardDataComming(pCom->mDeviceType);
}

void CKDCARDCtrl::FireTakeEvent()
{
	FireTakeCardComming();
}

short CKDCARDCtrl::OpenKD6006Com() 
{
	// TODO: Add your dispatch handler code here
    int ret;
    ret = pCom->KD6006.gOpenKD606Com();
  	if(ret==-1)
	{
 		pCom->KD6006.gCom.AsynClose();
	}
  	return ret;
}

short CKDCARDCtrl::OpenKDECom() 
{
	// TODO: Add your dispatch handler code here
    int ret;

 	ret = pCom->kde4787.gOpenKDMCom();
 	if(ret==-1) 
	{
 		pCom->kde4787.gCom.AsynClose();
 	}
 	return ret;
}

⌨️ 快捷键说明

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