`

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;
}
} 
 

2、ActiveX 控件实现:
      这里我们选择ATL控件实现,而非MFC ActiveX。
      文件-》新建-》ATL项目->填写项目名称(“FROMYANTAI”)-》选择动态链接库(DLL)-》完成。
完成后,会在右边“解决方案资源管理器”生成很多头H文件和CPP实现文件,这些都是默认的不要修改。
(1)、添加一个ALT简单对象:鼠标邮件点击项目名称(刚才起的名字)选择-》添加类-》选择ATL简单对象。
下一步起一个名字:“ytiicrj”—》下一步:其他不变,在支持中,选择“连接点”和“IE对象支持”—》完成。
下 一步给“ytiicrj”添加一个方法,以便WEB页面调用。在“类视图”选择“iytiicrj”(有个灰色的钥匙图标)鼠标右键添加-》添加方法。方 法起名为“GetContent”-》参数属性选择IN,参数类型选择LONG 参数名 A –》添加;继续;参数属性选择IN,参数类型选择LONG 参数名 B –》添加;继续;参数属性选择OUT和RETVAL ,参数类型选择LONG* 参数名 out –》添加---》 点击完成。
这样就在ytiicrj.H头文件中添加了一个(在最后一行):
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
// ytiicrj
class 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;
} 
 

(4)、生成DLL:
这步很简单,右键点击右边项目名称,点击“属性”,选择 Release模式,在常规--》ATL的使用--》选择静态链接到ATL,否则项目将依赖VS2008的环境。点击项目进行生成。这样就在Release目录下生成了很多文件,我们要的就是一个DLL文件。

3、DLL和 ATL ActiveX 控件DLL 打包为CAB文件:
   例如:生成test.CAB后,WEB页面就会提示下载安装。
(1)首先定义setup.inf文件:它描述了下载的内容和目标目录还有版本号及相应的DLL文件。这个要手动编写的,我的内容如下(对应名称自行修改吧):
代码如下:

[version]
; version signature (same for both NT and Win95) do not remove
signature="$CHICAGO$"
AdvancedINF=2.0
[Add.Code]
AtlActiveX.dll=AtlActiveX.dll
TestDll.dll=TestDll.dll
setup.inf=setup.inf
[install.files]
AtlActiveX.dll=AtlActiveX.dll
TestDll.dll=TestDll.dll
setup.inf=setup.inf
[AtlActiveX.dll]
clsid={4AE870B5-C7FB-4171-A47E-7F57AFD86F67}
file-win32-x86=thiscab
FileVersion=1,0,0,1
DestDir=11
RegisterServer=yes
[TestDll.dll]
file-win32-x86=thiscab
DestDir=11
FileVersion=1,0,0,1
RegisterServer=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> 
 

说 明: codeBase="test.CAB#version=1,0,0,1" codeBase表示文件相对或者绝对路径;version表示版本号,如果这个号和INF文件的版本号一样,那么第二次访问页面就不会下载,否则每次都 下载。CLSID 是 ActiveX 项目生成的序号,具体可以在项目的*.rgs 文件中找到。
好了。所有的步骤都完成了,这时你运行test.htm,提示ActiveX控件,你选择允许,然后就可以调用加法运算了。
这只是一个简单的例子,在其中的DLL中,你可以实现自己的应用了。

可能碰到的问题:
(1)无法下载CAB包。
当用IE访问此页面是,需要进行如下设置:才能下载CAB包。否则系统会自动阻止。

(2)报内存错误,该内存不能为"written":
这种情况一般是使用IE8时候会报这个错误。
解决方案:

     如果使用的浏览器如果是ie8,需要在浏览器中设置“工具”-“Internet选项”-“高级”-“设置”-“安全”-把“启用内存保护帮助减少联机攻击”前面的对勾取消!否则网链接时出现问题,报内存错误。





  • 大小: 92.6 KB
  • 大小: 77.4 KB
  • 大小: 10.8 KB
  • 大小: 119.9 KB
1
0
分享到:
评论

相关推荐

    dll+activex+web简单例子(vs2005可运行)

    这个示例项目“dll+activex+web简单例子”使用了Visual Studio 2005,展示了如何将DLL和ActiveX控件结合到Web应用中,实现JavaScript与C++代码的交互,完成简单的加法运算。 首先,我们要理解DLL是什么。DLL...

    WEB页面通过ActiveX控件调用DLL动态库系列教程全部例程(vs2013)可用

    本教程聚焦于如何在WEB页面中通过ActiveX控件调用DLL动态库,这是一个典型的客户端交互与服务器端逻辑结合的实践。以下是对这些知识点的详细阐述: **DLL(动态链接库)** DLL是Windows操作系统提供的一种共享代码...

    ActiveX控件加载外部dll及html测试Demo

    ActiveX控件加载外部dll及html测试Demo 用VC2010编写,自已测试成功 Test.html为测试ActiveX控件页面 TestDll是dll动态库 Loaddll是测试TestDll的Demo FROMYANTAI为ActiveX控件,加载外部库TestDll,使用VC STL项目

    activex开发参考

    【DLL+ActiveX控件+WEB页面调用例子_javascript技巧_脚本之家.mht】文件可能是关于如何在Web页面中使用ActiveX控件的示例,特别是通过JavaScript进行调用的方法。MHT文件是一种单个文件的网页格式,它可能包含HTML、...

    在ActiveX控件中如何动态调用DLL函数之准一体化方法

    在ActiveX控件中动态调用DLL函数是Windows应用程序开发中的常见需求,尤其在使用Visual C++等开发工具时。ActiveX(以前称为OLE控件)是一种组件对象模型(COM),允许开发人员创建可重用的软件组件,而DLL(动态...

    firefox调用dll需要的activex控件和插件

    总的来说,"firefox调用dll需要的activex控件和插件"这一主题涉及到了Firefox浏览器的扩展性、ActiveX控件的技术原理以及跨平台兼容性的挑战。通过"ffactivex"这样的插件,用户可以在Firefox中实现与ActiveX相关的...

    ActiveX控件的使用与开发

    ActiveX控件是由DLL(Dynamic Link Library)文件组成的,这些文件包含了实现控件功能的代码和资源。控件可以通过接口与宿主应用程序进行通信,接口定义了控件对外暴露的方法和属性。在开发过程中,开发者可以使用...

    网页中显示带控件的ActiveX控件

    1. 功能强大:ActiveX控件可以直接调用系统资源,提供丰富的用户界面和复杂的交互功能。 2. 高度定制:开发者可以根据需求定制控件,实现特定的业务逻辑。 3. 提升用户体验:在某些场景下,ActiveX控件能提供比纯...

    atl-ActiveX-dll-inf-cab-web调用(总结篇)[参照].pdf

    总结来说,这个过程涉及C++编程、DLL和ActiveX控件的创建、Web页面的集成,以及对Windows API的深入理解。对于软件开发者,尤其是涉及到客户端应用和Web交互的场景,熟练掌握这些技术是至关重要的。

    在ActiveX控件中如何动态调用DLL函数.r.rar_activex_动态控件

    在某些情况下,我们可能需要在ActiveX控件中动态调用DLL(动态链接库)中的函数,以扩展控件的功能或利用已有的DLL资源。下面将详细介绍如何在ActiveX控件中实现这一目标。 首先,我们需要了解DLL的基本概念。DLL是...

    注册ActiveX控件方法

    注册ActiveX控件的过程主要是为了更新Windows系统注册表中的相关信息,告知系统哪些控件已经安装,并且可被调用。这一步骤对于确保控件功能的正常运行至关重要,因为未注册的控件无法被其他应用程序识别,从而导致...

    C#编写web页面ActiveX控件

    ActiveX控件,又称OLE控件或OCX控件,是一种软件组件或对象,能够被嵌入到Web页面或其他应用程序中。它们可以增强网页的功能性,例如添加多媒体元素、交互式对象或执行复杂的计算任务等。尽管传统的开发方式多使用...

    ActiveX DLL免注册调用(VB)

    ActiveX DLL通常包含一组函数或控件,这些函数或控件可以通过COM(组件对象模型)接口被其他应用程序调用。然而,常规流程是,当你下载或创建一个ActiveX DLL时,需要通过`regsvr32`命令行工具或其他注册工具将其...

    VB.NET调用VB6 Activex EXE实现PowerBasic和FreeBasic的标准DLL调用

    VB.NET可以自动识别并引用VB6的ActiveX控件,这是因为.NET Framework提供了对COM组件的内置支持。 要实现这个过程,你需要在VB.NET项目中添加对VB6 ActiveX EXE的引用。这通常通过“项目”-&gt;“添加引用”-&gt;“COM”...

    ActiveX控件注册的几种方法

    对于更高级的用户或开发者来说,还可以通过编程方式手动调用ActiveX控件中的`DllRegisterServer`函数来实现注册。这种方法更加灵活,但需要具备一定的编程技能。 ##### 操作示例(使用C++Builder为例): ```cpp ...

    使用C_开发ActiveX控件

    ### 使用C#开发ActiveX控件 #### 一、引言 ActiveX控件是一种重要的软件组件技术,它允许开发者创建可复用的组件,并能在多种应用环境中使用这些组件,如网页、桌面应用等。传统的ActiveX控件开发通常采用C++或...

    使用C#开发ActiveX控件全攻略

    这种方式使得C#开发的ActiveX控件能够被JavaScript、VBScript等脚本语言调用,也可以在其他支持ActiveX的应用程序中使用。 总结来说,使用C#开发ActiveX控件的关键在于理解COM和.NET之间的交互,以及如何通过.NET的...

    c# activex 控件

    总之,C# Activex控件是将C#的强大功能带入Web环境的一种方式,但随着Web技术的发展,如Web API、WebAssembly等新技术的出现,开发者也需要关注更现代、跨平台的解决方案。然而,对于仍然依赖ActiveX的遗留系统,...

Global site tag (gtag.js) - Google Analytics