3,245
社区成员
发帖
与我相关
我的任务
分享
BSTR CICReaderCtlCtrl::setTextBox(LPCTSTR name)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState());
CString cardSN;
long long cardNum(0);
char tempstr[261];
GetATR myReader;
CComPtr<IOleClientSite> ClientSite;
CComPtr<IOleContainer> Container;
int ret(0);
int lastState(0);//上次读卡状态
CString lastValue("");
ClientSite = this->GetClientSite();
ClientSite->GetContainer(&Container);
CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2> spDoc(Container);
IHTMLDocument3 * spDoc3 = NULL;
CComPtr<IHTMLElement> spElem;
spDoc->QueryInterface(IID_IHTMLDocument3, (PVOID*)&spDoc3);
HRESULT hr;
hr = spDoc3->getElementById(CComBSTR(name),&spElem);
if (FAILED(hr))
{
return CString(name).AllocSysString();
}
while (1)
{
Sleep(500);
myReader.clearBuffers();
myReader.OnInit();
if (myReader.OnConnect() == SCARD_S_SUCCESS)
{
//读出卡号
myReader.OnGetATR();
myReader.makeCmd(1);
myReader.sendCmd();
if(!myReader.recvAnalyze(1))
{
memset(tempstr,0,261);
for( int index = 0; index < 4 ; index++ )
{
sprintf( tempstr, "%s%02X", tempstr, myReader.RecvBuff[index] );
}
sprintf( tempstr, "%s\n", tempstr );
cardNum=strtol(tempstr,(char**)NULL, 16);
}
cardSN.Format("%lld", cardNum);
myReader.OnDisconnect();
//return cardSN.AllocSysString();
//检测文本框数据1,是否为空 2,是否缺失 3,是否为本次卡号
if (spDoc3)
{
BSTR textValue =NULL;
spElem->get_innerText(&textValue);
if ( ( CString(textValue).Compare(lastValue) != 0 ) || ( CString(textValue).IsEmpty() != 0 ) )//与上次不同或为空
{
spElem->put_innerText(CComBSTR(cardSN));//填写文本框
lastValue = cardSN;
}
SysFreeString(textValue);
}
}
//return lastValue.AllocSysString();
}
}
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>ActiveX test</title>
<script language = 'javascript'>
function getUID()
{
var iResult = MYAvtiveX.getCardNum();//get cardNum
alert(iResult);
}
function getATS()
{
var iResult = MYAvtiveX.getATS();//get cardNum
alert(iResult);
}
function getBlock()
{
var iResult1 = MYAvtiveX.readBlock(0x05,0x10);//read block
alert(iResult1);
}
function connect()
{
var iResult2 = MYAvtiveX.connect();//check connect
alert(iResult2);
}
function writeTest()
{
var a = "123wwe222";
var iResult3 = MYAvtiveX.writeBlock(0x05,a);//write block
alert(iResult3);
}
function getCardNum()
{
var a = "MyText";
var iResult3 = MYAvtiveX.setTextBox(a);//get url
//alert(iResult3);
}
</script>
</head>
<body onload="getCardNum()">
<object id="MYAvtiveX" classid="clsid:BE09B27D-6B4A-456C-9DB7-98495655EFED"> </object>
<fieldset>
<legend>MyActiveX test</legend>
<table width="100%" border="1">
<tr><td width="20%"><input type='button' onclick='getUID()' value='getUID'> </td> </tr>
<tr><td width="20%"><input type='button' onclick='getATS()' value='getATS'> </td> </tr>
<tr><td width="20%"><input type='button' onclick='getBlock()' value='getBlock'> </td> </tr>
<tr><td width="20%"><input type='button' onclick='connect()' value='connect'> </td> </tr>
<tr><td width="20%"><input type='button' onclick='writeTest()' value='writeTest'> </td> </tr>
// <tr><td width="20%"><input type='button' onclick='getCardNum()' value='getCardNum'> </td> </tr>
</table>
<textarea id="MyText" name="yj" clos="20" rows="5"></textarea>
</fieldset>
</body>
</html>
static const DWORD _dwICReaderCtlOleMisc =
OLEMISC_INVISIBLEATRUNTIME |
OLEMISC_ACTIVATEWHENVISIBLE |
OLEMISC_SETCLIENTSITEFIRST |
OLEMISC_INSIDEOUT |
OLEMISC_CANTLINKINSIDE |
OLEMISC_RECOMPOSEONRESIZE;
void CICReaderCtlCtrl::OnTimer(UINT_PTR nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
if (nIDEvent == 1000)
{
CComPtr<IOleClientSite> ClientSite;
CComPtr<IOleContainer> Container;
CString lastValue("");
ClientSite = this->GetClientSite();
ClientSite->GetContainer(&Container);
CComQIPtr<IHTMLDocument2, &IID_IHTMLDocument2> spDoc(Container);
IHTMLDocument3 * spDoc3 = NULL;
CComPtr<IHTMLElement> spElem;
spDoc->QueryInterface(IID_IHTMLDocument3, (PVOID*)&spDoc3);
HRESULT hr;
hr = spDoc3->getElementById(CComBSTR(L"MyText"),&spElem);
if (FAILED(hr))
{
return;
}
if (spDoc3)
{
BSTR textValue =NULL;
spElem->get_innerText(&textValue);
if ( ( CString(textValue).Compare(lastValue) != 0 ) || ( CString(textValue).IsEmpty() != 0 ) )//与上次不同或为空
{
spElem->put_innerText(CComBSTR(L"hello world!!"));//填写文本框
lastValue = "";
}
spElem->put_innerText(CComBSTR(L"hello world!!"));//填写文本框
lastValue = "";
SysFreeString(textValue);
}
}
COleControl::OnTimer(nIDEvent);
}
//该函数在Activex控件被加载,初始化并创建出窗口的时候被调用,相当于在Activex刚被加载出来的时候就设置一个计时器。
int CICReaderCtlCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (COleControl::OnCreate(lpCreateStruct) == -1)
return -1;
//设置一个ID为1000,触发间隔为500ms的计时器
SetTimer(1000, 500, NULL);
return 0;
}
然后打开类向导给CICReaderCtlCtrl添加WM_TIMER消息处理函数:
void CICReaderCtlCtrl::OnTimer(UINT_PTR nIDEvent)
{
if (nIDEvent == 1000)
{
//在这里执行你的查询代码
}
COleControl::OnTimer(nIDEvent);
}
这样从Activex被加载启动开始,每隔500毫秒就会执行你的查询代码。
方法2.使用javascript计时器,javascript也可以设置计时器,间隔500ms调用Activex的函数进行查询,关于javascript如何设置计时器,网上已经有很多了,搜一搜就知道了。