h中主要代码如下
public:
enum {
dispidGetIcCarNum = 4L,
eventidreturnIcNum = 1L,
dispidGetIcNum = 3L,
dispidClose = 2L,
dispidOpen = 1L
};
public:
VARIANT_BOOL Open(void);
VARIANT_BOOL Close(void);
VARIANT_BOOL GetIcNum(void);
//static DWORD WINAPI ThreadProc(LPVOID lpParam);
LRESULT ActiveMessage(WPARAM wParam, LPARAM lParam);
public: void returnIcNum(void) //ocx中的用户自定义消息
{
FireEvent(eventidreturnIcNum, EVENT_PARAM(VTS_NONE));
}
protected:
BSTR GetIcCarNum(void);cpp中的代码如下// 事件映射BEGIN_EVENT_MAP(CICreadCtrl, COleControl)
EVENT_CUSTOM_ID("returnIcNum", eventidreturnIcNum, returnIcNum, VTS_NONE) //消息映射,javascript主
//要就是响应此消息
END_EVENT_MAP()
-
-
省略
-
-
unsigned char buff[512] = {0};
unsigned char num[512] = {0};
bool is_read = false;
HANDLE m_read;
TCHAR sz[2] = { 0 };
CString str;
BSTR icNum;
// CICreadCtrl 消息处理程序
//DWORD WINAPI CICreadCtrl::ThreadProc(LPVOID lpParam)
LONG ThreadProc(LPVOID lpParam)
{ while(true)
{
is_read = m_ic.RFID_Search(buff);
if(is_read == true)
{
sndPlaySound( "C:\\WINDOWS\\Media\\ding.wav ",SND_ASYNC); for (int i = 0; i < _mbslen(buff) / sizeof(buff[0]); i++)
{
_stprintf(sz, TEXT("%02X"), buff[i]);
str += sz;
}
icNum = str.AllocSysString();
CICreadCtrl *pClass = (CICreadCtrl *)lpParam;
/*pClass->returnIcNum();*/
PostMessage(pClass->m_hWnd, //发送消息,经过容器调试,确实发送了消息
WM_SEND,
(WPARAM)NULL,
(LPARAM)NULL); //AfxMessageBox(str,NULL,NULL);
str.Empty();
} Sleep(1000);
}
return 0;
}
VARIANT_BOOL CICreadCtrl::Open(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState()); // TODO: 在此添加调度处理程序代码
bool is_open,is_rfid_open;
is_open = m_ic.OpenPort();
if(is_open == true)
{
is_rfid_open = m_ic.RFID_Open();
if(is_rfid_open == true)
{
sndPlaySound( "C:\\WINDOWS\\Media\\ding.wav ",SND_ASYNC);
return VARIANT_TRUE;
}else
{
VARIANT_FALSE;
}
}
return VARIANT_FALSE;
}VARIANT_BOOL CICreadCtrl::Close(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState()); // TODO: 在此添加调度处理程序代码
if(m_read != INVALID_HANDLE_VALUE)
{
CloseHandle(m_read);
m_read = INVALID_HANDLE_VALUE ;
}
bool is_close,is_rfid_close;
is_rfid_close = m_ic.RFID_Close();
if(is_rfid_close == true)
{
is_close = m_ic.ClosePort();
if(is_close == true)
{
return VARIANT_TRUE;
}else
{
return VARIANT_FALSE;
}
}
return VARIANT_FALSE;
}VARIANT_BOOL CICreadCtrl::GetIcNum(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState()); // TODO: 在此添加调度处理程序代码
DWORD dwThreadID;
if (m_read = CreateThread (NULL, NULL,(LPTHREAD_START_ROUTINE)ThreadProc, (LPVOID)this, NULL, &dwThreadID))
{
return VARIANT_TRUE; }
return VARIANT_FALSE;
}BSTR CICreadCtrl::GetIcCarNum(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState()); CString strResult; // TODO: 在此添加调度处理程序代码 return icNum;
}
LRESULT CICreadCtrl::ActiveMessage(WPARAM wParam,LPARAM lParam)
{
returnIcNum(); //调用ocx用户自定义消息
return TRUE;
}
javascript代码
<BODY><OBJECT id="devread" classid="clsid:B89A3D94-CC48-41F8-BA82-734DFDC48FDE" codebase="ICread.ocx" >
</OBJECT> <script type="text/javascript">var resetCardBool=new Boolean()
resetCardBool = devread.open();
if(resetCardBool)
{
alert("打开成功");
devread.GetIcNum();
}else
{
alert("打开失败");
resetCardBool = devread.close();
if(resetCardBool)
{
alert("关闭成功");
}else
{
alert("关闭失败");
}
}
</script>
<script language="JavaScript" type="text/javascript" for="devread" event="returnIcNum()"> //怎么都响应不
//了,有木有呀
{ alert("信春哥得永生");
}
</script>
</BODY>详细
因为是IC卡的读卡 OCX,要网页调用,所以必须启动线程,一直检测有木有卡,一但检测有卡,就会发送消息,javascript 响应,去调用函数取得卡号,传给网页使用。找了很多资料,都找不到问题解决方法
public:
enum {
dispidGetIcCarNum = 4L,
eventidreturnIcNum = 1L,
dispidGetIcNum = 3L,
dispidClose = 2L,
dispidOpen = 1L
};
public:
VARIANT_BOOL Open(void);
VARIANT_BOOL Close(void);
VARIANT_BOOL GetIcNum(void);
//static DWORD WINAPI ThreadProc(LPVOID lpParam);
LRESULT ActiveMessage(WPARAM wParam, LPARAM lParam);
public: void returnIcNum(void) //ocx中的用户自定义消息
{
FireEvent(eventidreturnIcNum, EVENT_PARAM(VTS_NONE));
}
protected:
BSTR GetIcCarNum(void);cpp中的代码如下// 事件映射BEGIN_EVENT_MAP(CICreadCtrl, COleControl)
EVENT_CUSTOM_ID("returnIcNum", eventidreturnIcNum, returnIcNum, VTS_NONE) //消息映射,javascript主
//要就是响应此消息
END_EVENT_MAP()
-
-
省略
-
-
unsigned char buff[512] = {0};
unsigned char num[512] = {0};
bool is_read = false;
HANDLE m_read;
TCHAR sz[2] = { 0 };
CString str;
BSTR icNum;
// CICreadCtrl 消息处理程序
//DWORD WINAPI CICreadCtrl::ThreadProc(LPVOID lpParam)
LONG ThreadProc(LPVOID lpParam)
{ while(true)
{
is_read = m_ic.RFID_Search(buff);
if(is_read == true)
{
sndPlaySound( "C:\\WINDOWS\\Media\\ding.wav ",SND_ASYNC); for (int i = 0; i < _mbslen(buff) / sizeof(buff[0]); i++)
{
_stprintf(sz, TEXT("%02X"), buff[i]);
str += sz;
}
icNum = str.AllocSysString();
CICreadCtrl *pClass = (CICreadCtrl *)lpParam;
/*pClass->returnIcNum();*/
PostMessage(pClass->m_hWnd, //发送消息,经过容器调试,确实发送了消息
WM_SEND,
(WPARAM)NULL,
(LPARAM)NULL); //AfxMessageBox(str,NULL,NULL);
str.Empty();
} Sleep(1000);
}
return 0;
}
VARIANT_BOOL CICreadCtrl::Open(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState()); // TODO: 在此添加调度处理程序代码
bool is_open,is_rfid_open;
is_open = m_ic.OpenPort();
if(is_open == true)
{
is_rfid_open = m_ic.RFID_Open();
if(is_rfid_open == true)
{
sndPlaySound( "C:\\WINDOWS\\Media\\ding.wav ",SND_ASYNC);
return VARIANT_TRUE;
}else
{
VARIANT_FALSE;
}
}
return VARIANT_FALSE;
}VARIANT_BOOL CICreadCtrl::Close(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState()); // TODO: 在此添加调度处理程序代码
if(m_read != INVALID_HANDLE_VALUE)
{
CloseHandle(m_read);
m_read = INVALID_HANDLE_VALUE ;
}
bool is_close,is_rfid_close;
is_rfid_close = m_ic.RFID_Close();
if(is_rfid_close == true)
{
is_close = m_ic.ClosePort();
if(is_close == true)
{
return VARIANT_TRUE;
}else
{
return VARIANT_FALSE;
}
}
return VARIANT_FALSE;
}VARIANT_BOOL CICreadCtrl::GetIcNum(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState()); // TODO: 在此添加调度处理程序代码
DWORD dwThreadID;
if (m_read = CreateThread (NULL, NULL,(LPTHREAD_START_ROUTINE)ThreadProc, (LPVOID)this, NULL, &dwThreadID))
{
return VARIANT_TRUE; }
return VARIANT_FALSE;
}BSTR CICreadCtrl::GetIcCarNum(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState()); CString strResult; // TODO: 在此添加调度处理程序代码 return icNum;
}
LRESULT CICreadCtrl::ActiveMessage(WPARAM wParam,LPARAM lParam)
{
returnIcNum(); //调用ocx用户自定义消息
return TRUE;
}
javascript代码
<BODY><OBJECT id="devread" classid="clsid:B89A3D94-CC48-41F8-BA82-734DFDC48FDE" codebase="ICread.ocx" >
</OBJECT> <script type="text/javascript">var resetCardBool=new Boolean()
resetCardBool = devread.open();
if(resetCardBool)
{
alert("打开成功");
devread.GetIcNum();
}else
{
alert("打开失败");
resetCardBool = devread.close();
if(resetCardBool)
{
alert("关闭成功");
}else
{
alert("关闭失败");
}
}
</script>
<script language="JavaScript" type="text/javascript" for="devread" event="returnIcNum()"> //怎么都响应不
//了,有木有呀
{ alert("信春哥得永生");
}
</script>
</BODY>详细
因为是IC卡的读卡 OCX,要网页调用,所以必须启动线程,一直检测有木有卡,一但检测有卡,就会发送消息,javascript 响应,去调用函数取得卡号,传给网页使用。找了很多资料,都找不到问题解决方法
#include "afxwin.h"
#include "ICreadCtrl.h"
class CHideWindows :
public CWnd
{DECLARE_MESSAGE_MAP()
public:
CHideWindows(void);
~CHideWindows(void);
public:
CICreadCtrl* m_pCtrl;
public:
LRESULT OnFireThreadEvent(WPARAM wParam, LPARAM lParam);
HWND Create();
void PostNcDestroy();
};
#include "StdAfx.h"
#include "HideWindows.h"
BEGIN_MESSAGE_MAP(CHideWindows, CWnd)
ON_MESSAGE(WM_THREADEVENT, OnFireThreadEvent)
END_MESSAGE_MAP()CHideWindows::CHideWindows(void)
{
}CHideWindows::~CHideWindows(void)
{
}
LRESULT CHideWindows::OnFireThreadEvent(WPARAM wParam, LPARAM lParam)
{
m_pCtrl->ActiveMessage(wParam,lParam);
return 0;
}
HWND CHideWindows::Create()
{
//Register a window class
LPCTSTR classname = 0;
classname = AfxRegisterWndClass(0); //Create the window and return it's handle
CWnd::CreateEx(NULL,classname,NULL,NULL,1,1,1,1,NULL,NULL);
ASSERT(m_hWnd!=NULL);
return m_hWnd;
}
void CHideWindows::PostNcDestroy()
{
// TODO: Add your specialized code here and/or call the base class
CWnd::PostNcDestroy();
delete this;
}CICreadCtrl.cpp
VARIANT_BOOL CICreadCtrl::GetIcNum(void)
{
AFX_MANAGE_STATE(AfxGetStaticModuleState()); // TODO: 在此添加调度处理程序代码
DWORD dwThreadID; m_bEnd = FALSE; CHideWindows *pwnd = new CHideWindows;
pwnd->m_pCtrl = this;
m_hideWnd = pwnd->Create(); if (m_read = CreateThread (NULL, NULL,(LPTHREAD_START_ROUTINE)ThreadProc, (LPVOID)this, NULL, &dwThreadID))
{
return VARIANT_TRUE; }
return VARIANT_FALSE;
}LONG ThreadProc(LPVOID lpParam)
{
while(true)
{
is_read = m_ic.RFID_Search(buff);
if(is_read == true)
{
for (int i = 0; i < _mbslen(buff) / sizeof(buff[0]); i++)
{
_stprintf(sz, TEXT("%02X"), buff[i]);
str += sz;
}
icNum = str.AllocSysString(); CICreadCtrl* pctrl = (CICreadCtrl*)lpParam;
if(!pctrl->m_bEnd)
{
sndPlaySound( "C:\\WINDOWS\\Media\\ding.wav ",SND_ASYNC);
PostMessage(pctrl->m_hideWnd, WM_THREADEVENT, (WPARAM)NULL, (LPARAM)NULL);
}
str.Empty();
} Sleep(1000);
}
return 0;
}
这样javascript就可以响应ocx事件了