0

0

DLL+ ActiveX控件+WEB页面调用例子_javascript技巧

php中文网

php中文网

发布时间:2016-05-16 18:21:40

|

2007人浏览过

|

来源于php中文网

原创

一、 概述

因项目需要,开始学习并研究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
#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 }
}

(3)可选。新建一个WIN32控制台类,测试这个DLL。
文件-》新建-》WIN32控制台->填写项目名称-》选择控制台程序-》空项目-》完成。
在解决方案面板中,加入一个实现文件loaddll.cpp 内容:

复制代码 代码如下:

#include
#include
using namespace std;
typedef int (*AddFunc)(int,int); //定义指针函数、接口。
typedef void (*FunctionFunc)();
int main()
{
AddFunc _AddFunc;
FunctionFunc _FunctionFunc;
cout // L 表示使用UNICODE 字符集,要和项目的字符集保持一致。
HINSTANCE hInstLibrary = LoadLibrary(L"E:\Project\VS\LoadDll\Release\TestDll.dll");
if (hInstLibrary == NULL)
{
cout FreeLibrary(hInstLibrary);
}else{
cout }
_AddFunc = (AddFunc)GetProcAddress(hInstLibrary, "Add");
_FunctionFunc = (FunctionFunc)GetProcAddress(hInstLibrary, "Function");
if ((_AddFunc == NULL) || (_FunctionFunc == NULL))
{
FreeLibrary(hInstLibrary);//释放
}else{
cout }
cout _FunctionFunc(); //
cin.get(); // 获得焦点,这样就不会程序就不会一闪而过了。
FreeLibrary(hInstLibrary);//调用完后,要释放内存。
return(1);
}

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 的声明 黑体(粗体)部分是具体的实现,其他未动。

立即学习Java免费学习笔记(深入)”;

讯飞听见会议
讯飞听见会议

科大讯飞推出的AI智能会议系统

下载
复制代码 代码如下:

#pragma once
#include "resource.h" // 主符号
#include //添加
#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,
public CComObjectRootEx,
public CComCoClass,
public IConnectionPointContainerImpl,
public CProxy_ICaluNumCtrlEvents,
public IObjectWithSiteImpl,
public IDispatchImpl
{
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(a),static_cast(b));
*out = static_cast(sum);
this->_AtlFinalRelease();
return S_OK;
}

(4)、生成DLL:
这步很简单,选择 Release模式,点击项目进行生成(会提示选择REG32注册,那就选择被)。这样就在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内容如下:

复制代码 代码如下:



New Page

<script language="javascript"> <br>function doTest() <br>{ <br>var sum = CaluNumCtrl.GetContent(1,1); <br>alert(sum); <br>} <br></script>






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

相关文章

.dll文件大全
.dll文件大全

.dll文件缺失怎么办?.dll文件在哪下载?不用担心,这里为大家提供了所有的.dll文件下载,无论用户丢失的是什么.dll文件,在这里都能找到。用户保存后,在网盘搜索dll文件全称即可查找下载!

下载

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

通义千问
通义千问

阿里巴巴推出的全能AI助手

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法
pixiv网页版官网登录与阅读指南_pixiv官网直达入口与在线访问方法

本专题系统整理pixiv网页版官网入口及登录访问方式,涵盖官网登录页面直达路径、在线阅读入口及快速进入方法说明,帮助用户高效找到pixiv官方网站,实现便捷、安全的网页端浏览与账号登录体验。

1044

2026.02.13

微博网页版主页入口与登录指南_官方网页端快速访问方法
微博网页版主页入口与登录指南_官方网页端快速访问方法

本专题系统整理微博网页版官方入口及网页端登录方式,涵盖首页直达地址、账号登录流程与常见访问问题说明,帮助用户快速找到微博官网主页,实现便捷、安全的网页端登录与内容浏览体验。

334

2026.02.13

Flutter跨平台开发与状态管理实战
Flutter跨平台开发与状态管理实战

本专题围绕Flutter框架展开,系统讲解跨平台UI构建原理与状态管理方案。内容涵盖Widget生命周期、路由管理、Provider与Bloc状态管理模式、网络请求封装及性能优化技巧。通过实战项目演示,帮助开发者构建流畅、可维护的跨平台移动应用。

213

2026.02.13

TypeScript工程化开发与Vite构建优化实践
TypeScript工程化开发与Vite构建优化实践

本专题面向前端开发者,深入讲解 TypeScript 类型系统与大型项目结构设计方法,并结合 Vite 构建工具优化前端工程化流程。内容包括模块化设计、类型声明管理、代码分割、热更新原理以及构建性能调优。通过完整项目示例,帮助开发者提升代码可维护性与开发效率。

35

2026.02.13

Redis高可用架构与分布式缓存实战
Redis高可用架构与分布式缓存实战

本专题围绕 Redis 在高并发系统中的应用展开,系统讲解主从复制、哨兵机制、Cluster 集群模式及数据分片原理。内容涵盖缓存穿透与雪崩解决方案、分布式锁实现、热点数据优化及持久化策略。通过真实业务场景演示,帮助开发者构建高可用、可扩展的分布式缓存系统。

111

2026.02.13

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

77

2026.02.12

雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法
雨课堂网页版登录入口与使用指南_官方在线教学平台访问方法

本专题系统整理雨课堂网页版官方入口及在线登录方式,涵盖账号登录流程、官方直连入口及平台访问方法说明,帮助师生用户快速进入雨课堂在线教学平台,实现便捷、高效的课程学习与教学管理体验。

17

2026.02.12

豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法
豆包AI网页版入口与智能创作指南_官方在线写作与图片生成使用方法

本专题汇总豆包AI官方网页版入口及在线使用方式,涵盖智能写作工具、图片生成体验入口和官网登录方法,帮助用户快速直达豆包AI平台,高效完成文本创作与AI生图任务,实现便捷智能创作体验。

813

2026.02.12

PostgreSQL性能优化与索引调优实战
PostgreSQL性能优化与索引调优实战

本专题面向后端开发与数据库工程师,深入讲解 PostgreSQL 查询优化原理与索引机制。内容包括执行计划分析、常见索引类型对比、慢查询优化策略、事务隔离级别以及高并发场景下的性能调优技巧。通过实战案例解析,帮助开发者提升数据库响应速度与系统稳定性。

97

2026.02.12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 3.8万人学习

ThinkPHP6.x 微实战--十天技能课堂
ThinkPHP6.x 微实战--十天技能课堂

共26课时 | 1.8万人学习

ThinkPHP6.x API接口--十天技能课堂
ThinkPHP6.x API接口--十天技能课堂

共14课时 | 1.2万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号