vs2015开发在网页中调用的ocx控件详解(一)
1 创建mfc ActiveX工程
使用vs2105新建一个mfc ActiveX工程,工程名称为ocx_test,如果要在ocx控件中使用对话框,那么就勾选“在插入对象对话框中可用”
更改工程的属性,mfc的使用改为在静态库中使用mfc,字符集未未设置。
2 在控件中使用嵌入对话框
在工程的资源视图中插入一个对话框
然后将对话框的属性修改,style改为child,visible改为true
右键该对话框-添加类
为该对话框创建一个类,名称为CDialog1
在ocx_testCtrl.h文件中添加对话框的头文件
#include"Dialog1.h"//引入对话框类的头文件
在public中添加对话框的变量定义
CDialog1 dlg1;//声明对话框类的对象
接下来在类向导中为Cocx_testCtrl类添加消息响应VM_CREATE
在OnCreate函数中添加:
dlg1.Create(IDD_DIALOG1, this);
接着在onDraw函数改为如下代码:
/*pdc->FillRect(rcBounds, CBrush::FromHandle((HBRUSH)GetStockObject(WHITE_BRUSH)));pdc->Ellipse(rcBounds);*/dlg1.MoveWindow(rcBounds, true);
接下来生成工程,ocx会自动进行注册。
3 在网页中调用ocx
打开ocx_test.idl这个文件,从如下地方找到ocx的classID
新建一个html,html中的Classid就为上图中的值
<html>
<head><title>test</title><meta charset="utf-8" />
</head><body>
<object id=fp_atl border=0 classid=CLSID:16EEE8BE-67C3-4A6D-B892-DBE374724FA8 width="400" height="400";>
</object>
</body>
</html>
然后使用ie浏览器打开这个html,就可以看到网页中出现了含有对话框的ocx控件。
4 去掉浏览器弹出交互不安全提示
当使用上面创建的这种ocx,在浏览器中会有不安全提示
解决办法是在ocx_testCtrl.h文件中添加一个头文件
#include<ObjSafe.h>
在该类的protect的中添加消息声明:
//去掉安全警告 BEGINDECLARE_INTERFACE_MAP()BEGIN_INTERFACE_PART(ObjectSafety, IObjectSafety)STDMETHOD(GetInterfaceSafetyOptions)(REFIID riid, DWORD __RPC_FAR *pdwSupportedOptions, DWORD __RPC_FAR *pdwEnabledOptions);STDMETHOD(SetInterfaceSafetyOptions)(REFIID riid, DWORD dwOptionSetMask, DWORD dwEnabledOptions);END_INTERFACE_PART(ObjectSafety)//去掉安全警告 END
接着在ocx_testCtrl.cpp文件中IMPLEMENT_OLECTLTYPE(Cocx_testCtrl, IDS_OCX_TEST, _dwocx_testOleMisc)后面添加:
//注意要将这个里面的类名替换为自己工程的那个类名
//去掉安全警告 BEGIN
BEGIN_INTERFACE_MAP(Cocx_testCtrl, COleControl)INTERFACE_PART(Cocx_testCtrl, IID_IObjectSafety, ObjectSafety)
END_INTERFACE_MAP()
// Implementation of IObjectSafety
STDMETHODIMP Cocx_testCtrl::XObjectSafety::GetInterfaceSafetyOptions(REFIID riid,DWORD __RPC_FAR *pdwSupportedOptions,DWORD __RPC_FAR *pdwEnabledOptions)
{METHOD_PROLOGUE_EX(Cocx_testCtrl, ObjectSafety)if (!pdwSupportedOptions || !pdwEnabledOptions){return E_POINTER;}*pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER| INTERFACESAFE_FOR_UNTRUSTED_DATA;*pdwEnabledOptions = 0;if (NULL == pThis->GetInterface(&riid)){TRACE("Requested interface is not supported.\n");return E_NOINTERFACE;}// What interface is being checked out anyhow?OLECHAR szGUID[39];int i = StringFromGUID2(riid, szGUID, 39);if (riid == IID_IDispatch){// Client wants to know if object is safe for scripting*pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER;return S_OK;}else if (riid == IID_IPersistPropertyBag|| riid == IID_IPersistStreamInit|| riid == IID_IPersistStorage|| riid == IID_IPersistMemory){// Those are the persistence interfaces COleControl derived controls support// as indicated in AFXCTL.H// Client wants to know if object is safe for initializing from persistent data*pdwEnabledOptions = INTERFACESAFE_FOR_UNTRUSTED_DATA;return S_OK;}else{// Find out what interface this is, and decide what options to enableTRACE("");return E_NOINTERFACE;}
}
STDMETHODIMP Cocx_testCtrl::XObjectSafety::SetInterfaceSafetyOptions(REFIID riid,DWORD dwOptionSetMask,DWORD dwEnabledOptions)
{METHOD_PROLOGUE_EX(Cocx_testCtrl, ObjectSafety)OLECHAR szGUID[39];// What is this interface anyway?// We can do a quick lookup in the registry under HKEY_CLASSES_ROOT\Interfaceint i = StringFromGUID2(riid, szGUID, 39);if (0 == dwOptionSetMask && 0 == dwEnabledOptions){// the control certainly supports NO requests through the specified interface// so it"s safe to return S_OK even if the interface isn"t supported.return S_OK;}// Do we support the specified interface?if (NULL == pThis->GetInterface(&riid)){TRACE1("%s is not support.\n", szGUID);return E_FAIL;}if (riid == IID_IDispatch){TRACE("");TRACE("In other words, is the control safe for scripting?\n");if (INTERFACESAFE_FOR_UNTRUSTED_CALLER == dwOptionSetMask&& INTERFACESAFE_FOR_UNTRUSTED_CALLER == dwEnabledOptions){return S_OK;}else{return E_FAIL;}}else if (riid == IID_IPersistPropertyBag|| riid == IID_IPersistStreamInit|| riid == IID_IPersistStorage|| riid == IID_IPersistMemory){TRACE("");TRACE("In other words, is the control safe for initializing from persistent data?\n");if (INTERFACESAFE_FOR_UNTRUSTED_DATA == dwOptionSetMask&& INTERFACESAFE_FOR_UNTRUSTED_DATA == dwEnabledOptions){return NOERROR;}else{return E_FAIL;}}else{TRACE1("", szGUID);return E_FAIL;}
}
STDMETHODIMP_(ULONG) Cocx_testCtrl::XObjectSafety::AddRef()
{METHOD_PROLOGUE_EX_(Cocx_testCtrl, ObjectSafety)return (ULONG)pThis->ExternalAddRef();
}
STDMETHODIMP_(ULONG) Cocx_testCtrl::XObjectSafety::Release()
{METHOD_PROLOGUE_EX_(Cocx_testCtrl, ObjectSafety)return (ULONG)pThis->ExternalRelease();
}
STDMETHODIMP Cocx_testCtrl::XObjectSafety::QueryInterface(REFIID iid, LPVOID* ppvObj)
{METHOD_PROLOGUE_EX_(Cocx_testCtrl, ObjectSafety)return (HRESULT)pThis->ExternalQueryInterface(&iid, ppvObj);
}
//去掉安全警告 END
然后重新生成项目,再次在网页中调用,就可以看到没有出现不安全警告了。
vs2015开发在网页中调用的ocx控件详解(一)相关推荐
- vs2015开发在网页中调用的ocx控件详解(二)
在上一篇博客中介绍了ocx控件的基本创建,这里主要讲解如何在网页中与ocx控件进行信息传递. 1 ocx添加成员变量 在类视图中右键ocx_testLib下的_Docx_test,选择添加属性 变量类 ...
- 【QT】Qt调用OCX控件详解
OCX控件的注册 首先,调用ocx控件需要保证ocx本身是已经注册了的.如果没有注册请先按"Win+R"输入"cmd"打开命令窗口.然后输入regsvr32 + ...
- C#调用第三方ocx控件 (winform /aspx)
C#调用第三方ocx控件 1..net环境在工具箱上点右键,选择自定义工具箱,然后选择你需要的COM或者OCX控件就可以了. 2.在自定义工具箱中加入相应的控件,设置id,在客户端脚本中直接引用它的I ...
- OCX控件开发及WEB Javascript如何使用OCX控件
一.OCX控件开发 1.使用IDE版本: VS2010 2..基于MFC技术 开发OCX控件. 3..基本OCX开发过程 3.1.打开VS 2010 新建项目,选择MFC模板,"MFC ...
- 如何在多线程中调用winform窗体控件2——实例篇
如何在多线程中调用winform窗体控件2--实例篇 针对之前文章<如何在多线程中调用winform窗体控件>,下面举个我项目中的实际案例,这是一个我自定义控件在异步设置焦点时的代码.在新 ...
- 在VC中如何使用OCX控件 【来源:http://blog.csdn.net/wulang1114/article/details/4806089】
首先感谢网络中的各位高手,我的文章只是对你们文章的Copy和学习. 工作中客户提供了一个ocx控件,学习了如何使用它.发现网上没用针对像我一样菜鸟的文章,所以我总结一下我的学习成果供菜鸟学习使用. 1 ...
- C#中引用第三方ocx控件引发的问题以及解决办法
C#中引用第三方ocx控件引发的问题以及解决办法 参考文章: (1)C#中引用第三方ocx控件引发的问题以及解决办法 (2)https://www.cnblogs.com/XuPengLB/p/759 ...
- android什么控件能够输入多行文字,Android开发:文本控件详解——EditText(一)基本属性...
一.简单实例: EditText输入的文字样式部分的属性,基本都是和TextView中的属性一样. 除此之外,EditText还有自己独有的属性. 二.基本属性: hint 输入框显示的提示文本 te ...
- pythongui日历控件_“五一”快到了,用Python中PyQt5做一个日历,QCalendar控件详解...
前面内容,我们详细了解了PyQt5中的一些常用控件 精彩内容回顾 Python用PyQt5设计界面,如何正确显示一幅图片,QPixmap控件详解 拥有漂亮的笔刷才能绘制多彩界面,PythonPyQt5 ...
- dsscocx控件出错怎么办_MFC中如何在Ocx控件中来驱动ocx事件
我在写一个ocx控件.在控件内有一个自定义的类,处理逻辑相关的事件,比如MyClass.h和MyClass.cpp,当有人call我时,我就能在MyClass的线程内得到信息,现在我要通知给使用我这个 ...
最新文章
- JavaScript知识精简
- 毕业设计《MMORPG DEMO》——1
- 测试Mybatis时事务自动回滚,无法完成增删改
- mysql数据库复制基本原理_MySQL的复制原理以及流程
- mysql 必知必会 笔记
- android studio adb 命令行,Android Studio如何配置adb以及经常使用命令
- C语言 const 修饰变量 - C语言零基础入门教程
- GoogLeNet的心路历程(一)
- 1215课后练习----判断字符串位置
- CSS设置背景透明字体不透明
- 光流(五)--HS光流及稠密光流
- 运行100万秒无错误!
- iphone 开发第四天 - 字符串
- The program ‘roscore‘ is currently not installed 解决办法
- python正版软件多少钱_多款正版软件 + 付费教程迎来史低价,少数派「双十一」活动全面开始...
- 中望3d快捷键命令大全_cad快捷键大全下载
- matlab车牌自动定位,超级实用的车牌定位matlab程序
- ios-获取相册相机图片
- 日置HIOKI PW3198电能质量分析仪
- 在ARM芯片中使用打印函数总结