www.gusucode.com > 编写在浏览器中不弹出警告的ActiveX控件C++源码程序 > 编写在浏览器中不弹出警告的ActiveX控件/ICCard/ICCard/ICCardCtl.cpp
/* * Copyright (c) 2003,GDC * All rights reserved. * * 文件名称:ICCardCtl.C * 文件标识:见配置管理计划书 * 摘要:读IC卡OCX控件的类实现文件 * * 当前版本:0.1 beta * 作者:王正平 * 完成日期:2003年06月10日 */ #include "stdafx.h" #include "ICCard.h" #include "ICCardCtl.h" #include "ICCardPpg.h" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif // 调用动态链接库用,放在共享内存段 #pragma data_seg("mydata") static HINSTANCE DLLInst = NULL; //动态库句柄 #pragma data_seg() // 动态链接库引出函数定义 typedef int (__stdcall READ_HOST_S)(int ComPort, char* buf); READ_HOST_S* Read_Host_S; IMPLEMENT_DYNCREATE(CICCardCtrl, COleControl) ///////////////////////////////////////////////////////////////////////////// // Message map BEGIN_MESSAGE_MAP(CICCardCtrl, COleControl) //{{AFX_MSG_MAP(CICCardCtrl) ON_WM_CREATE() ON_WM_DESTROY() //}}AFX_MSG_MAP ON_OLEVERB(AFX_IDS_VERB_PROPERTIES, OnProperties) END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // Dispatch map BEGIN_DISPATCH_MAP(CICCardCtrl, COleControl) //{{AFX_DISPATCH_MAP(CICCardCtrl) DISP_PROPERTY_NOTIFY(CICCardCtrl, "ComPort", m_comPort, OnComPortChanged, VT_I2) DISP_FUNCTION(CICCardCtrl, "ReadICCard", ReadICCard, VT_BSTR, VTS_NONE) DISP_STOCKPROP_ENABLED() //}}AFX_DISPATCH_MAP DISP_FUNCTION_ID(CICCardCtrl, "AboutBox", DISPID_ABOUTBOX, AboutBox, VT_EMPTY, VTS_NONE) END_DISPATCH_MAP() ///////////////////////////////////////////////////////////////////////////// // Event map BEGIN_EVENT_MAP(CICCardCtrl, COleControl) //{{AFX_EVENT_MAP(CICCardCtrl) //}}AFX_EVENT_MAP END_EVENT_MAP() ///////////////////////////////////////////////////////////////////////////// // Property pages BEGIN_PROPPAGEIDS(CICCardCtrl, 1) PROPPAGEID(CICCardPropPage::guid) END_PROPPAGEIDS(CICCardCtrl) ///////////////////////////////////////////////////////////////////////////// // Initialize class factory and guid IMPLEMENT_OLECREATE_EX(CICCardCtrl, "ICCARD.ICCardCtrl.1", 0x7ae7497b, 0xcad8, 0x4e66, 0xa5, 0x8b, 0xdd, 0xe9, 0xbc, 0xaf, 0x6b, 0x61) ///////////////////////////////////////////////////////////////////////////// // Type library ID and version IMPLEMENT_OLETYPELIB(CICCardCtrl, _tlid, _wVerMajor, _wVerMinor) ///////////////////////////////////////////////////////////////////////////// // Interface IDs const IID BASED_CODE IID_DICCard = { 0x7ee8b159, 0x980f, 0x4380, { 0x84, 0x5a, 0x28, 0xd7, 0xd, 0x1b, 0xf7, 0x5c } }; const IID BASED_CODE IID_DICCardEvents = { 0xcef07ba8, 0x3493, 0x47f6, { 0x8e, 0x24, 0x24, 0xda, 0x79, 0x14, 0xa0, 0x84 } }; ///////////////////////////////////////////////////////////////////////////// // Control type information static const DWORD BASED_CODE _dwICCardOleMisc = OLEMISC_INVISIBLEATRUNTIME | OLEMISC_ACTIVATEWHENVISIBLE | OLEMISC_SETCLIENTSITEFIRST | OLEMISC_INSIDEOUT | OLEMISC_CANTLINKINSIDE | OLEMISC_RECOMPOSEONRESIZE; IMPLEMENT_OLECTLTYPE(CICCardCtrl, IDS_ICCARD, _dwICCardOleMisc) ///////////////////////////////////////////////////////////////////////////// // CICCardCtrl::CICCardCtrlFactory::UpdateRegistry - // Adds or removes system registry entries for CICCardCtrl BOOL CICCardCtrl::CICCardCtrlFactory::UpdateRegistry(BOOL bRegister) { if (bRegister) return AfxOleRegisterControlClass( AfxGetInstanceHandle(), m_clsid, m_lpszProgID, IDS_ICCARD, IDB_ICCARD, afxRegApartmentThreading, _dwICCardOleMisc, _tlid, _wVerMajor, _wVerMinor); else return AfxOleUnregisterClass(m_clsid, m_lpszProgID); } ///////////////////////////////////////////////////////////////////////////// // CICCardCtrl::CICCardCtrl - Constructor CICCardCtrl::CICCardCtrl() { InitializeIIDs(&IID_DICCard, &IID_DICCardEvents); // 设置控件尺寸 SetInitialSize(24, 22); // 串口端口号,默认为0x01 //m_comPort = DEFAULT_COM_PORT; // 加载动态链接库 LoadDll(); } ///////////////////////////////////////////////////////////////////////////// // CICCardCtrl::~CICCardCtrl - Destructor CICCardCtrl::~CICCardCtrl() { // 卸载DLL if (DLLInst!=NULL) FreeLibrary(DLLInst); } ///////////////////////////////////////////////////////////////////////////// // CICCardCtrl::OnDraw - Drawing function void CICCardCtrl::OnDraw( CDC* pdc, const CRect& rcBounds, const CRect& rcInvalid) { pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH))); pdc->Ellipse(rcBounds); pdc->TextOut(rcBounds.left+6,rcBounds.top+4, "IC"); } ///////////////////////////////////////////////////////////////////////////// // CICCardCtrl::DoPropExchange - Persistence support void CICCardCtrl::DoPropExchange(CPropExchange* pPX) { ExchangeVersion(pPX, MAKELONG(_wVerMinor, _wVerMajor)); COleControl::DoPropExchange(pPX); // 持久属性 //PX_Short(pPX, _T("ComPort"), (short)m_comPort, (short)DEFAULT_COM_PORT); } ///////////////////////////////////////////////////////////////////////////// // CICCardCtrl::OnResetState - Reset control to default state void CICCardCtrl::OnResetState() { COleControl::OnResetState(); // Resets defaults found in DoPropExchange } /***************************************************************** * 函数介绍: 调用关于对话框函数 * 输入参数: 无 * 输出参数: 无 * 返 回 值: 无 *****************************************************************/ void CICCardCtrl::AboutBox() { CDialog dlgAbout(IDD_ABOUTBOX_ICCARD); dlgAbout.DoModal(); } /***************************************************************** * 函数介绍: 当调用属性Enabled改变时触发 * 输入参数: 无 * 输出参数: 无 * 返 回 值: 无 *****************************************************************/ void CICCardCtrl::OnEnabledChanged() { COleControl::OnEnabledChanged(); } /***************************************************************** * 函数介绍: 当调用SetInitialSize()时触发 * 输入参数: 无 * 输出参数: 无 * 返 回 值: 无 *****************************************************************/ void CICCardCtrl::OnSetClientSite() { // 引起OnCreate的调用 RecreateControlWindow(); COleControl::OnSetClientSite(); } /***************************************************************** * 函数介绍: 类创建函数 * 输入参数: LPCREATESTRUCT lpCreateStruct - 创建参数结构 * 输出参数: 无 * 返 回 值: int - 成功返回0,否则-1 *****************************************************************/ int CICCardCtrl::OnCreate(LPCREATESTRUCT lpCreateStruct) { if (COleControl::OnCreate(lpCreateStruct) == -1) return -1; // 加载端口号 CWinApp* pApp = AfxGetApp(); m_comPort = pApp->GetProfileInt("ComPort", "Port", DEFAULT_COM_PORT); return 0; } /***************************************************************** * 函数介绍: 类销毁函数 * 输入参数: 无 * 输出参数: 无 * 返 回 值: 无 *****************************************************************/ void CICCardCtrl::OnDestroy() { // 保存端口号 CWinApp* pApp = AfxGetApp(); pApp->WriteProfileInt("ComPort", "Port", m_comPort); COleControl::OnDestroy(); } /***************************************************************** * 函数介绍: 读IC卡方法, 他发送一个消息,调用消息函数触发事件 * 输入参数: 无 * 输出参数: 无 * 返 回 值: 读到的串 *****************************************************************/ BSTR CICCardCtrl::ReadICCard() { CString strResult; LPTSTR p; p = strResult.GetBuffer(1120); int nRet = Read_Host_S(m_comPort, p); strResult.ReleaseBuffer(); // 如果成功 if (nRet==0) { return strResult.AllocSysString(); } else { return NULL; } } //===================自定义部分=================================// /***************************************************************** * 函数介绍: 加载DLL文件,引出函数 * 输入参数: 无 * 输出参数: 无 * 返 回 值: BOOL *****************************************************************/ BOOL CICCardCtrl::LoadDll() { HRSRC hResInfo; HGLOBAL hRes; HINSTANCE hInst; // 查找DLL资源 hInst = AfxGetInstanceHandle(); hResInfo = FindResource(hInst, (LPCTSTR)IDR_DLL1,"DLL" ); // 加载资源 hRes = LoadResource(hInst,hResInfo ); // 计算DLL文件大小 DWORD dFileLength = SizeofResource(hInst, hResInfo ); // 获取系统路径 char pPath[MAX_PATH]; GetSystemDirectory(pPath, MAX_PATH); // 生成文件名 strcpy(g_pFile, pPath); strcat(g_pFile, "\\HGIC.Dll"); // 创建DLL文件 HANDLE hFile = CreateFile(g_pFile, GENERIC_WRITE | GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, CREATE_NEW, FILE_ATTRIBUTE_NORMAL,NULL); DWORD dwNumberOfBytesWritten = 0; // 写DLL文件 if(hFile > 0) WriteFile(hFile, (LPCVOID)hRes, dFileLength, &dwNumberOfBytesWritten, NULL); else MessageBox("加载Res不成功","提示信息",MB_OK); // 释放文件句柄 CloseHandle(hFile); // 动态加载DLL DLLInst = LoadLibrary(g_pFile); // 如果加载成功,找出函数地址 if (DLLInst!=NULL) { Read_Host_S = (READ_HOST_S*)GetProcAddress(DLLInst, "Read_Host_S"); } else { ::MessageBox(NULL,"加载动态库失败!", "提示信息", MB_OK | MB_ICONINFORMATION); return false; } return true; } void CICCardCtrl::OnComPortChanged() { // TODO: Add notification handler code SetModifiedFlag(); }