DLL+ ActiveX控件+WEB页面调用例子最近在项目中用到了:通过读卡器读身份证信息的控件,在网上找了很多资料,
DLL+ ActiveX控件+WEB页面调用例子
最近在项目中用到了:通过读卡器读身份证信息的控件,在网上找了很多资料,现在把他们共享出来。
原文地址:
http://www.jb51.net/article/24485.htm
因项目需要,开始学习并研究VC、DLL及ActiveX控件,网上资料找了很多,但没一个可用的或者说没一个例子可理解并运行的。没办法,自己研究吧。功夫不负有心人,终有小成了,呵呵,现在把自己学习总结了一下,献给需要的人。
一、 概述
因项目需要,开始学习并研究VC、DLL及ActiveX控件,网上资料找了很多,但没一个可用的或者说没一个例子可理解并运行的。没办法,自己研究吧。功夫不负有心人,终有小成了,呵呵,现在把自己学习总结了一下,献给需要的人。
DLL(动态链接库): 分WIN32 DLL和MFC DLL
ActiveX:分ATL控件和MFC控件两类(也是一个DLL)
WEB:JAVASCRIPT 调用-> ActiveX调用-> DLL 完成加法运算并返回值,在页面上显示。
二、开发(VS2008)
1、DLL 库编写:
文件-》新建-》WIN32控制台->填写项目名称-》选择DLL-》空项目-》完成。
(1)在解决方案面板中,加入一个头文件testdll.h,内容:
代码如下:
#ifndef _DLLTUT_DLL_H_#define _DLLTUT_DLL_H_#if defined DLL_EXPORT#define DECLDIR __declspec(dllexport)#else#define DECLDIR __declspec(dllimport)#endif//extern "C"告诉编译器该部分可以在C/C++中使用。extern "C"{DECLDIR int Add( int a, int b );DECLDIR void Function( void );}#endif ?(2)在解决方案面板中,加入一个实现文件testdll.cpp,内容:
#include <iostream>#define DLL_EXPORT#include "testdll.h"extern "C"{// 这里主要用到 ADD 方法。DECLDIR int Add( int a, int b ){return( a + b );}DECLDIR void Function( void ){std::cout << "DLL Called!" << std::endl;}} ?
(3)可选。新建一个WIN32控制台类,测试这个DLL。
文件-》新建-》WIN32控制台->填写项目名称-》选择控制台程序-》空项目-》完成。
在解决方案面板中,加入一个实现文件loaddll.cpp 内容:
#include <iostream>#define DLL_EXPORT#include "testdll.h"extern "C"{// 这里主要用到 ADD 方法。DECLDIR int Add( int a, int b ){return( a + b );}DECLDIR void Function( void ){std::cout << "DLL Called!" << std::endl;}} ?
STDMETHOD(GetContent)(LONG a, LONG b, LONG* out); 并在ytiicrj.CPP文件中添加了一个实现类:
STDMETHODIMP CCaluNumCtrl::GetContent(LONG a, LONG b, LONG* out){// TODO: 在此添加实现代码return S_OK;}?(2)、在ytiicrj.H 文件中,调用DLL类库。代码如下:
// CaluNumCtrl.h : ytiicrj 的声明 黑体(粗体)部分是具体的实现,其他未动。
#pragma once#include "resource.h" // 主符号
#include <windows.h> //添加#include "AtlActiveX_i.h"#include "_ICaluNumCtrlEvents_CP.h"#if defined(_WIN32_WCE) && !defined(_CE_DCOM) && !defined(_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA)#error "Windows CE 平台(如不提供完全DCOM 支持的Windows Mobile 平台)上无法正确支持单线程COM 对象。定义_CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA 可强制ATL 支持创建单线程COM 对象实现并允许使用其单线程COM 对象实现。rgs 文件中的线程模型已被设置为“Free”,原因是该模型是非DCOM Windows CE 平台支持的唯一线程模型。"#endif// ytiicrjclass ATL_NO_VTABLE Cytiicrj :
//增加一下一行:安全提示解除,--当运行浏览器调用时,不会提示安全问题。public IObjectSafetyImpl<Cytiicrj, INTERFACESAFE_FOR_UNTRUSTED_CALLER| INTERFACESAFE_FOR_UNTRUSTED_DATA>,public CComObjectRootEx<CComSingleThreadModel>,public CComCoClass<Cytiicrj, &CLSID_CaluNumCtrl>,public IConnectionPointContainerImpl<Cytiicrj>,public CProxy_ICaluNumCtrlEvents<Cytiicrj>,public IObjectWithSiteImpl<Cytiicrj>,public IDispatchImpl<ICaluNumCtrl, &IID_ICaluNumCtrl, &LIBID_AtlActiveXLib, 1, 0>{public:
//以下三行实现定义。typedef int (*AddFunc)(int,int); //类型定义,对应DLL ADD方法。Func自定义,随便写。HINSTANCE hInstLibrary;AddFunc _AddFunc; //类映射Cytiicrj(){
//开始调用DLL,进行计算。hInstLibrary = LoadLibrary(L"TestDll.dll");//把写好的DLL文件放在此项目生成的目录下if (hInstLibrary == NULL){FreeLibrary(hInstLibrary);//资源释放}else{}//调用方法,返回方法句柄。_AddFunc = (AddFunc)GetProcAddress(hInstLibrary, "Add");}DECLARE_REGISTRY_RESOURCEID(IDR_CALUNUMCTRL)BEGIN_COM_MAP(Cytiicrj)COM_INTERFACE_ENTRY(ICaluNumCtrl)COM_INTERFACE_ENTRY(IDispatch)COM_INTERFACE_ENTRY(IConnectionPointContainer)COM_INTERFACE_ENTRY(IObjectWithSite)
//增加一下一行:安全提示解除,--当运行浏览器调用时,不会提示安全问题。COM_INTERFACE_ENTRY(IObjectSafety)END_COM_MAP()BEGIN_CONNECTION_POINT_MAP(Cytiicrj)CONNECTION_POINT_ENTRY(__uuidof(_ICaluNumCtrlEvents))END_CONNECTION_POINT_MAP()DECLARE_PROTECT_FINAL_CONSTRUCT()HRESULT FinalConstruct(){return S_OK;}void FinalRelease(){
FreeLibrary(hInstLibrary);}public:STDMETHOD(GetContent)(LONG a, LONG b, LONG* out);};OBJECT_ENTRY_AUTO(__uuidof(CaluNumCtrl), Cytiicrj) ?
(3)、回到在ytiicrj.PP 文件中,添加实现代码如下:
STDMETHODIMP CCaluNumCtrl::GetContent(LONG a, LONG b, LONG* out){// TODO: 在此添加实现代码int sum = this->_AddFunc(static_cast<int>(a),static_cast<int>(b));*out = static_cast<LONG>(sum);this->_AtlFinalRelease();return S_OK;} ?
[version]; version signature (same for both NT and Win95) do not removesignature="$CHICAGO$"AdvancedINF=2.0[Add.Code]AtlActiveX.dll=AtlActiveX.dllTestDll.dll=TestDll.dllsetup.inf=setup.inf[install.files]AtlActiveX.dll=AtlActiveX.dllTestDll.dll=TestDll.dllsetup.inf=setup.inf[AtlActiveX.dll]clsid={4AE870B5-C7FB-4171-A47E-7F57AFD86F67}file-win32-x86=thiscabFileVersion=1,0,0,1DestDir=11RegisterServer=yes[TestDll.dll]file-win32-x86=thiscabDestDir=11FileVersion=1,0,0,1RegisterServer=yes[setup.inf]file=thiscab[RegisterFiles]%11%\AtlActiveX.dll; end of INF file ?
(2)整合资源:
将所用到的DLL全部放到一个目录下包括setup.inf文件,然后在开始运行:IExpress 命令去生成CAB包。
运行后,选择第一个,下一步,选择第三个,下一步,添加文件(选择你的DLL和INF文件),下一步,选择一个输出目录并创建一个CAB文件名,再选择第二个选项,下一步,选择第二个选项,然后OK。这样就生成了一个CAB文件。
(3)WEB页面调用 ActiveX 控件 进行加法运算 :
写一个test.htm网页和CAB文件放在一个目录,test.htm内容如下:
<HTML><HEAD><TITLE>New Page</TITLE><OBJECT id=CaluNumCtrl align="CENTER" WIDTH=0 HEIGHT=0 codeBase="test.CAB#version=1,0,0,1" classid="CLSID:B6D4B406-9CC4-4C80-B7A2-248BBB07F682"></OBJECT><script language="javascript">function doTest(){var sum = CaluNumCtrl.GetContent(1,1);alert(sum);}</script></HEAD><BODY><input type="button" value="renjie" id="btnOK" onclick="doTest();"></input></BODY></HTML> ?
好了。所有的步骤都完成了,这时你运行test.htm,提示ActiveX控件,你选择允许,然后就可以调用加法运算了。
这只是一个简单的例子,在其中的DLL中,你可以实现自己的应用了。解决方案:
????如果使用的浏览器如果是ie8,需要在浏览器中设置“工具”-“Internet选项”-“高级”-“设置”-“安全”-把“启用内存保护帮助减少联机攻击”前面的对勾取消!否则网链接时出现问题,报内存错误。