ATL组件和mfc ActiveX组件都可以供网页去调用,在我其它的博客中详细讲述了ocx组件的开发方式以及在网页中如何调用,在这篇博客中将详细讲解ATL组件的开发以及在网页中的调用。

1 创建ATL组件项目

打开vs2015,选择新建ATL项目

后面的页面都按照默认设置,最后一步点击完成。
项目创建完成后可以看到在解决方案资源管理器中有两个项目,一个项目名称为atl_test,一个项目为atl_testPS

2 添加ATL简单对象类

右键atl_test项目名称,选择添加–类

在打开的添加类对话框中选择添加ATL简单对象

在简称里输入类名,这里输入Test

点击完成,至此ATL简单对象类创建好了。

3 添加函数方法

在类视图中,右键ITest

右键ITest–添加–方法

输入方法名func
在参数特性里勾选in,这样先添加入参
输入入参以及入参类型

然后添加返回类型BSTR*
注意返回类型必须是指针类型
输入返回类型名称,然后勾选retval

点击添加,这样就添加了返回值了。

点击完成。
在Test.cpp中可以看到生成了该函数方法。

添加如下的代码:

#include "stdafx.h"
#include"Test.h"
#include<iostream>
#include<Windows.h>
#include<comutil.h>
using namespace std;
/*
项目属性--C/C++ -- 语言--将Wchar_t设置为内置类型选择是
然后添加comsuppw.lib这个lib库
如果选择否,就添加comsupp.lib这个lib库
*/
#pragma comment(lib,"comsuppw.lib")
// CTestSTDMETHODIMP CTest::func(BSTR name, BSTR* ret)
{// TODO: 在此添加实现代码//name为入参string s1 = _com_util::ConvertBSTRToString(name);s1 = "from C++" + s1;//ret为返回值BSTR bstr_ret = _com_util::ConvertStringToBSTR(s1.c_str());*ret =bstr_ret;SysFreeString(bstr_ret);//释放BSTR变量内存return S_OK;
}

然后右键atl_test这个项目,选择生成
这样就成功生成了ATL组件的dll库了。

4 注册ATL组件库

以管理员权限打开cmd
以cd命令进入到组件库的那个目录

然后输入注册命令:

regsvr32 atl_test.dll

可以看到注册成功

5 在html中使用js进行调用

在项目的idl文件atl_test.idl中可以查看该组件的classid,就是importlib这行代码下面的那个id

然后在网页中object元素中引入这个id就可以调用这个控件
网页中调用代码如下:

<html>
<head><title>test</title><meta charset="utf-8" />
</head>
<script type="text/javascript">function test1() {var ret=atl.func("hello");alert(ret);}
</script><body>
<object id=atl border=0 classid=CLSID:0F9024DF-450A-4B8B-B5B8-2B49ABA2E49D width="100" height="100";>
</object>
<div align="center"><input class="submit_01" type="button" value="ATL控件测试" onclick="test1()" />
</div>
</body>
</html>

使用IE浏览器打开这个网页,点击按钮

提示ActiveX控件的提示,点击是

可以看到成功调用了该函数。

6 标记控件为安全控件

当在步骤5中调用该函数时,可以看到有个警告提示框,那么如何避免该弹出框了?当然就是标记ATL组件为安全组件
ATL控件的接口类为CTest,我们打开接口类的头文件Test.h

在继承类的后面添加一个逗号, 然后在后面添加一行

public   IObjectSafetyImpl<CTest, INTERFACESAFE_FOR_UNTRUSTED_CALLER>


那个类名改成自己工程的ATL简单类的对象类名
在com映射map里添加这么一行

COM_INTERFACE_ENTRY(IObjectSafety)//添加一个com映射


如果在添加的过程中出现IObjectSafetyImpl未定义 ,那么就包含添加头文件Atlctl.h
整个头文件改完后的代码如下:

// Test.h : CTest 的声明#pragma once
#include "resource.h"       // 主符号#include "atl_test_i.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 平台支持的唯一线程模型。"
#endifusing namespace ATL;// CTestclass ATL_NO_VTABLE CTest :public CComObjectRootEx<CComSingleThreadModel>,public CComCoClass<CTest, &CLSID_Test>,public IDispatchImpl<ITest, &IID_ITest, &LIBID_atl_testLib, /*wMajor =*/ 1, /*wMinor =*/ 0>,public   IObjectSafetyImpl<CTest, INTERFACESAFE_FOR_UNTRUSTED_CALLER>
{public:CTest(){}DECLARE_REGISTRY_RESOURCEID(IDR_TEST)BEGIN_COM_MAP(CTest)COM_INTERFACE_ENTRY(ITest)COM_INTERFACE_ENTRY(IDispatch)COM_INTERFACE_ENTRY(IObjectSafety)//添加一个com映射
END_COM_MAP()DECLARE_PROTECT_FINAL_CONSTRUCT()HRESULT FinalConstruct(){return S_OK;}void FinalRelease(){}public:STDMETHOD(func)(BSTR name, BSTR* ret);
};OBJECT_ENTRY_AUTO(__uuidof(Test), CTest)

然后重新生成该工程
重新再次注册该组件,这样在网页中调用就没有出现安全提示了。

vs2015制作供js调用的ATL组件dll库详解相关推荐

  1. JS - 文件上传组件WebUploader使用详解1(带进度的文件上传

    一.基本介绍 1,什么是 WebUploader? WebUploader 是由百度公司团队开发的一个以 HTML5 为主,FLASH 为辅的现代文件上传组件. 官网地址:http://fex.bai ...

  2. 组件化实践详解(二)

    在上一篇文章<组件化实践详解(一)>中我们介绍了组件化实践的目标和实践步骤,本文继续说说关于组件化实践遇到的问题及思考. 1.组件内的架构设计 这条本来我是不想写的,但是很多组件化的文章里 ...

  3. 下拉多选框 微信小程序_微信小程序下拉框组件使用方法详解

    本文实例为大家分享了微信小程序下拉框组件的使用方法,供大家参考,具体内容如下 适用场景 1.省市三级联动 2.出生日期选择 3.性别选择 4.一般性的下拉选择等 一.省市三级联动使用 注意mode = ...

  4. vue.js循环for(列表渲染)详解

    vue.js循环for(列表渲染)详解 一.总结 一句话总结: v-for <ul id="example-1"> <li v-for="item in ...

  5. Vue 路由导航守卫(全局守卫、路由独享守卫、组件内守卫)详解

    Vue 路由导航守卫(全局守卫.路由独享守卫.组件内守卫)详解: 路由守卫 官方解释 "导航"表示路由正在发生改变.正如其名,vue-router提供的导航守卫主要用来通过跳转或取 ...

  6. SpringCloud2组件之Feign详解

    开发环境: 开发工具:IntelliJ IDEA Java版本:1.8 Spring Boot版本:2.1.6.RELEASE Spring Cloud版本:Greenwich.SR1 工程简介:   ...

  7. Win7下的内置FTP组件的设置详解

    Win7下的内置FTP组件的设置详解 在局域网中共享文件,FTP是比较方便的方案之一.Win7内部集成了FTP,只是设置起来颇费一番功夫.着文以记之. 一.安装FTP组件 由于Win7默认没有安装FT ...

  8. Vue.js - Font Awesome字体图标的使用详解(vue-fontawesome库)

    Vue.js - Font Awesome字体图标的使用详解(vue-fontawesome库) Font Awesome 是一个十分优秀的第三方图标库,我之前也写过文章介绍如何在 html 页面中使 ...

  9. 基于PHP和JS的AES相互加密解密方法详解(CryptoJS)

    在最近的项目中,前端后台数据交互需要进行加密之后传输使用,以保证系统数据的安全.有关数据加密解密的问题,有很多种加密的方式,在这里我选择了AES的加密方式.特此写下此篇博文,总结讲述下PHP和JS进行 ...

最新文章

  1. 突破帧率天花板,超速全时视觉感知芯片重塑机器视觉技术体系
  2. vs配置不依赖其他包路径
  3. JavaScript面向对象——深入理解寄生组合继承
  4. 前端学习(2586):如何设计高扩展路由
  5. linux-优化内核参数 /etc/sysctl.conf
  6. python中的numpy模块和pandas模块的区别_python的numpy模块- 01.pandas基本数据类型
  7. java servlet深入理解_深入理解 Java Servlet
  8. winform窗体——布局方式
  9. 网络安全学习常用站点导航-持续更新中
  10. 【Bug修复】java.lang.IllegalArgumentException、java.lang.NullPointerException 问题解决修复
  11. web前端期末大作业:基于HTML+CSS+JavaScript奥迪企业bootstrap响应式网站
  12. Android 6.0(棉花糖)新特性
  13. 三招轻松辨别微博含水量!提升广告主投放效果
  14. 【Linux】进程间通信-共享内存
  15. 总线通信协议-PCI
  16. 硕博电子-AGV小车控制器
  17. 代付业务-受托代付、委托代付
  18. 《趣味知识博文》小W与小L带你聊天式备考CDA Level Ⅰ(四)
  19. 2012最具有技术影响力本版图书评选
  20. 微信小程序源码反编译

热门文章

  1. 2.5 矩阵因式分解(第2章矩阵代数)
  2. 如何利用imagick合并2张图后为动态效果
  3. Apache atlas的UI界面如何修改密码
  4. Dubbo3 落地实践及 Mesh 解决方案
  5. 计算机硬盘无法启动怎么办,电脑硬盘不读盘无法开机怎么办
  6. Android 获取联系人姓名和电话号码信息
  7. 使用padding-bottom设置div的高度跟父元素的宽度相关联
  8. 数论[计算机数学专题(5)]
  9. 【程序设计】Java基本语法练习题
  10. Golang源码探索----GC的实现原理(6)