最终的插件可供MFC程序调用,也可供浏览器调用(仅IE浏览器支持)

1、创建MFC ActiveX控件,这里项目命名为MFC_ActiveX_2

2、项目属性—》配置属性—》常规—》MFC的使用,选择“在静态库中使用MFC”。

模块定义文件,创建项目时已自动配置好。

3、类视图—》MFC_ActiveX_2Lib—》右键_DMFC_ActiveX_2—》添加方法

这里添加一个返回类型为“DOUBLE”,方法名为“CalFun”,拥有两个参数类型为DOUBLE参数的方法。

4、然后在MFC_ActiveX_2Ctrl.cpp中就能看到刚刚添加的函数CalFun。这里对它做一些实现。

DOUBLE CMFC_ActiveX_2Ctrl::CalFun(DOUBLE num1, DOUBLE num2)
{AFX_MANAGE_STATE(AfxGetStaticModuleState());// TODO:  在此添加调度处理程序代码DOUBLE sum, difference, product, quotient;//运算加减乘除sum = num1 + num2;difference = num1 - num2;product = num1 * num2;quotient = (0 == num2) ? (0) : (num1/num2);CString sum_s, difference_s, product_s, quotient_s;sum_s.Format(_T("%lf"), sum);sum_s = _T("两个数的和为") + sum_s;difference_s.Format(_T("%lf"), difference);difference_s = _T("两个数的差为") + difference_s;product_s.Format(_T("%lf"), product);product_s = _T("两个数的积为") + product_s;quotient_s.Format(_T("%lf"), quotient);quotient_s = _T("两个数的商为") + quotient_s;//和的弹窗MessageBox(sum_s);//差的弹窗MessageBox(difference_s);//积的弹窗MessageBox(product_s);//商的弹窗MessageBox(quotient_s);return 0;
}

5、接下来需要声明组件安全性,对于ATL写的ActiveX,实现IObjectSafety即可;对于MFC写的ActiveX,可以通过修改注册表的方式来实现控件的安全性。

项目中新建Cathelp.h和Cathelp.cpp文件,并将以下代码复制进去。
Cathelp.h

#include "comcat.h"// Helper function to create a component category and associated
// description
HRESULT CreateComponentCategory(CATID catid, WCHAR* catDescription);// Helper function to register a CLSID as belonging to a component
// category
HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid);// HRESULT UnRegisterCLSIDInCategory - Remove entries from the registry
HRESULT UnRegisterCLSIDInCategory(REFCLSID clsid, CATID catid);

Cathelp.cpp

#include "stdafx.h"
#include "comcat.h"
#include "strsafe.h"
#include "objsafe.h"// HRESULT CreateComponentCategory - Used to register ActiveX control as safe
HRESULT CreateComponentCategory(CATID catid, WCHAR *catDescription)
{ICatRegister *pcr = NULL ;HRESULT hr = S_OK ;hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);if (FAILED(hr))return hr;// Make sure the HKCR\Component Categories\{..catid...}// key is registered.CATEGORYINFO catinfo;catinfo.catid = catid;catinfo.lcid = 0x0409 ; // englishsize_t len;// Make sure the provided description is not too long.// Only copy the first 127 characters if it is.// The second parameter of StringCchLength is the maximum// number of characters that may be read into catDescription.// There must be room for a NULL-terminator. The third parameter// contains the number of characters excluding the NULL-terminator.hr = StringCchLength(catDescription, STRSAFE_MAX_CCH, &len);if (SUCCEEDED(hr)){if (len>127){len = 127;}}   else{// TODO: Write an error handler;}// The second parameter of StringCchCopy is 128 because you need // room for a NULL-terminator.hr = StringCchCopy(catinfo.szDescription, len + 1, catDescription);// Make sure the description is null terminated.catinfo.szDescription[len + 1] = '\0';hr = pcr->RegisterCategories(1, &catinfo);pcr->Release();return hr;
}// HRESULT RegisterCLSIDInCategory -
//      Register your component categories information
HRESULT RegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
{// Register your component categories information.ICatRegister *pcr = NULL ;HRESULT hr = S_OK ;hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);if (SUCCEEDED(hr)){// Register this category as being "implemented" by the class.CATID rgcatid[1] ;rgcatid[0] = catid;hr = pcr->RegisterClassImplCategories(clsid, 1, rgcatid);}if (pcr != NULL)pcr->Release();return hr;
}// HRESULT UnRegisterCLSIDInCategory - Remove entries from the registry
HRESULT UnRegisterCLSIDInCategory(REFCLSID clsid, CATID catid)
{ICatRegister *pcr = NULL ;HRESULT hr = S_OK ;hr = CoCreateInstance(CLSID_StdComponentCategoriesMgr, NULL, CLSCTX_INPROC_SERVER, IID_ICatRegister, (void**)&pcr);if (SUCCEEDED(hr)){// Unregister this category as being "implemented" by the class.CATID rgcatid[1] ;rgcatid[0] = catid;hr = pcr->UnRegisterClassImplCategories(clsid, 1, rgcatid);}if (pcr != NULL)pcr->Release();return hr;
}


6、在MFC_ActiveX_2.cpp文件中,添加CLSID_SafeItem的定义:

其中的数值,是根据MFC_ActiveX_2Ctrl.cpp中的IMPLEMENT_OLECREATE_EX(实际上就是ActiveX的CLASSID)获取的。

7、另外,MFC_ActiveX_2.cpp中起始处还需引入两个头文件

8、修改MFC_ActiveX_2.cpp中DllRegisterServer和DllUnregisterServer函数

// DllRegisterServer - 将项添加到系统注册表
// DllRegisterServer - Adds entries to the system registrySTDAPI DllRegisterServer(void)
{HRESULT hr;    // HResult used by Safety FunctionsAFX_MANAGE_STATE(_afxModuleAddrThis);if (!AfxOleRegisterTypeLib(AfxGetInstanceHandle(), _tlid))return ResultFromScode(SELFREG_E_TYPELIB);if (!COleObjectFactoryEx::UpdateRegistryAll(TRUE))return ResultFromScode(SELFREG_E_CLASS);// Mark the control as safe for initializing.hr = CreateComponentCategory(CATID_SafeForInitializing,L"Controls safely initializable from persistent data!");if (FAILED(hr))return hr;hr = RegisterCLSIDInCategory(CLSID_SafeItem,CATID_SafeForInitializing);if (FAILED(hr))return hr;// Mark the control as safe for scripting.hr = CreateComponentCategory(CATID_SafeForScripting,L"Controls safely  scriptable!");if (FAILED(hr))return hr;hr = RegisterCLSIDInCategory(CLSID_SafeItem,CATID_SafeForScripting);if (FAILED(hr))return hr;return NOERROR;
}// DllUnregisterServer - 将项从系统注册表中移除
// DllUnregisterServer - Removes entries from the system registrySTDAPI DllUnregisterServer(void)
{AFX_MANAGE_STATE(_afxModuleAddrThis);// 删除控件初始化安全入口.   HRESULT hr = UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForInitializing);if (FAILED(hr))return hr;// 删除控件脚本安全入口   hr = UnRegisterCLSIDInCategory(CLSID_SafeItem, CATID_SafeForScripting);if (FAILED(hr))return hr;if (!AfxOleUnregisterTypeLib(_tlid, _wVerMajor, _wVerMinor))return ResultFromScode(SELFREG_E_TYPELIB);if (!COleObjectFactoryEx::UpdateRegistryAll(FALSE))return ResultFromScode(SELFREG_E_CLASS);return NOERROR;
}

9、编译工程,生成MFC_ActiveX_2.ocx。接下来进行注册,管理员身份运行cmd,进入到MFC_ActiveX_2.ocx目录,通过命令“regsvr32 MFC_ActiveX_2.ocx”注册。

10、在注册表—》HKEY_CLASSES_ROOT—》直接键盘输出MFC找到我们注册信息。

也可以通过在工程下—》MFC_ActiveX_2.idl,找到这个值

11、之后我们就可以写一份html来调用看看了,通过IE浏览器打开

<HTML>
<HEAD>
<TITLE>Test ActiveX</TITLE>  <script language="javascript" type="text/javascript">function functionInfo() {var result = Dean.CalFun(1.1,3.3);alert(result);}</script></HEAD>
<OBJECT ID="Dean" WIDTH=528 HEIGHT=545 classid="CLSID:7BA07224-5176-4C69-8084-4960D8F67DDC">  <PARAM NAME="_Version" VALUE="65536">  <PARAM NAME="_ExtentX" VALUE="12806">  <PARAM NAME="_ExtentY" VALUE="1747">  <PARAM NAME="_StockProps" VALUE="0">
</OBJECT>
<body>
<input type="button" value="test" onclick="functionInfo()">
</body>
</HTML>

简单MFC ActiveX插件例子相关推荐

  1. C#ActiveX插件制作

    ActiveX制作 VS2008 VS2017皆可 Windows系统服务_C#WebSocket服务_C#调用ActiveX实现多种浏览器调用ActiveX插件例子下载 新建 VS2017新建C#- ...

  2. VS2017创建MFC ActiveX工程制作IE OCX插件

    最近看了一个采用MFC ActiveX封装DLL的OCX项目的源码,现将学习到的内容记录下来.本次的学习记录计划写如下几个主题: 1.VS2017创建MFC ActiveX工程制作IE OCX插件 2 ...

  3. VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程

    VC2005从开发MFC ActiveX ocx控件到发布到.net网站的全部过程 开篇语:最近在弄ocx控件发布到asp.net网站上使用,就是用户在使用过程中,自动下载安装ocx控件.(此文章也是 ...

  4. 有关于mfc webbrowser插件的使用

    近期写的东西中经常须要嵌入一些浏览器,微软提供了一个比較好的接口,能够在MFC写的程序中嵌入一个简易的浏览器,是以ActiveX插件的形式提供的接口,使用起来也比較的方便,这里我就简单记录下这个插件的 ...

  5. C++ 使用VS2010创建MFC ActiveX工程项目

    1.ActiveX的基本概念 ActiveX控件可以看作是一个极小的服务器应用程序,它不能独立运行,必须嵌入到某个容器程序中,与该容器一起运行.这个容器包括WEB网页,应用程序窗体等... Activ ...

  6. ActiveX插件的Z-Index属性无效问题解决

    在Web开发中我们经常通过z-index设置多个元素之间的层叠关系,这种方式在多数情况下很有效,但是如果遇到有窗体元素时这种方式常常显得无能为力,今天我们就一块看一下如何有效的解决这个问题. 在Web ...

  7. VLC的ACtiveX插件使用方法

    在Roger看来对VLC的二次开发 包括把VLC嵌入自己的应用 ,以及修改VLC本身的功能和特性.本文主要讲前者.总的来说把VLC内嵌入自己的应用有4种途径: 直接调用VLC进程(喂喂喂-这也算?) ...

  8. ActiveX插件的使用

    一.简述 ActiveX插件源自微软,主要作为IE浏览器的插件程序,在这里我们不多介绍了,主要是对这方面应用不是很懂.前段时间由于工作需要了解了一些,通过网上查询的一些资料对如何生成以及如何使用Act ...

  9. 【UI插件】简单的日历插件(下)—— 学习MVC思想

    前言 我们上次写了一个简单的日历插件,但是只是一个半成品,而且做完后发现一些问题,于是我们今天尝试来解决这些问题 PS:距离上次貌似很久了 上次,我们大概遇到哪些问题呢: ① 既然想做一套UI库,那么 ...

  10. MFC ActiveX 打包 CAB

    MFC ActiveX打包CAB 准备打包签名工具和要打包的文件 将需要签名和打包的 OCX .dll和命令放到相同文件夹. 制作签名证书 在命令行运行下面命令: makecert.exe -ss r ...

最新文章

  1. Facebook 正在研究新型 AI 系统,以自我视角与世界进行交互
  2. Bzoj2957: 楼房重建
  3. css3-1 css3游戏介绍、css3样式和优先级
  4. Linux下的docker容器安装教程
  5. 解决问题ImportError: HDFStore requires PyTables, quot;No module named 'tables'quot; problem importing
  6. Mysql存储引擎原理
  7. 密码学加密算法分类_密码学中的国际数据加密算法(IDEA)
  8. nginx反向代理配置如何去除前缀
  9. Leetcode每日一题:110.balanced-binary-tree(平衡二叉树)
  10. maven项目引入sqljdbc4 找不到包的完美 解决方案。
  11. 解决!Gallery中嵌套ListView,Gallery不能滑动的问题
  12. (超详细)2022年最新版java 8( jdk1.8u321)安装教程
  13. 整流管与稳压管的参数和选择原则
  14. PID算法原理及基本实现
  15. html无序列表转换为图片,HTML 无序列表项目符号使用图片的CSS写法
  16. 电梯远程监控系统方案
  17. 网站设计流程分为哪几个步骤
  18. 2022爬取微博评论-极简40行代码
  19. openstack ovs-vswitch收包流程
  20. 江南计算机研究所招聘物联网学院,江南大学:物联网工程学院培育物联网精英人才...

热门文章

  1. 自学python需要看书_一个小白的转行自学Python的经历
  2. python过京东app图形验证_Python实现京东自动登录(自动完成滑块验证)
  3. MATLAB实验总结定积分,matlab实验报告--定积分的近似计算 -
  4. Vue中 keep-alive 详解
  5. 数控系统数据采集协同架构,集成马扎克(mazak)、西门子(Siemens)、海德汉(heidenhain)、广数、凯恩帝(knd)、三菱、海德汉、兄弟、哈斯、宝元、新代、发那科(Fanuc)、华中
  6. [Proteus8]使用proteus8对单片机进行模拟仿真,记录方波图出现的过程
  7. ADF实现主副控件联动的方法
  8. ArcGIS计算地形湿度指数
  9. c语言函数 java,C语言函数
  10. 事实表和维度表得概念