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 响应,去调用函数取得卡号,传给网页使用。找了很多资料,都找不到问题解决方法

解决方案 »

  1.   

    你的fire要在窗口县城不在窗口县城的话就先post到窗口县城,再在窗口县城处理
      

  2.   

    我解决了,我的方法是创建一个自己的窗口类继承 CWnd类,在 CICreadCtrl中创建自己的隐藏窗口,通过自定义消息给隐藏窗口发送消息,隐藏窗口响应消息后调用CICreadCtrl的事件函数(当然在自己以窗口类中要先定义CICreadCtrl变量)#pragma once
    #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事件了