原文http://support.microsoft.com/kb/182598/zh-cn

从 Visual Basic 6.0 CD-ROM(安装目录) 中获取 OLE 自动化类型库生成器。若要执行此操作将所有四个文件从 /Common/Tools/VB/Unsupprt/Typlib/ 文件夹复制到您的项目文件夹中。

将以下文本复制到记事本,,将文件保存为 Objsafe.odl 项目文件夹中:

[

uuid(C67830E0-D11D-11cf-BD80-00AA00575603),

helpstring("VB IObjectSafety Interface"),

version(1.0)

]

library IObjectSafetyTLB

{

importlib("stdole2.tlb");

[

uuid(CB5BDC81-93C1-11cf-8F20-00805F2CD064),

helpstring("IObjectSafety Interface"),

odl

]

interface IObjectSafety:IUnknown {

[helpstring("GetInterfaceSafetyOptions")]

HRESULT GetInterfaceSafetyOptions(

[in]  long  riid,

[in]  long *pdwSupportedOptions,

[in]  long *pdwEnabledOptions);

[helpstring("SetInterfaceSafetyOptions")]

HRESULT SetInterfaceSafetyOptions(

[in]  long  riid,

[in]  long  dwOptionsSetMask,

[in]  long  dwEnabledOptions);

}

}

在命令提示符使用 CD <path>

将移动到项目文件夹,然后键入以下命令来生成.tlb 文件的命令:MKTYPLIB objsafe.odl /tlb objsafe.tlb

利用tlb注册工具将文件注册

注册工具可以在http://download.csdn.net/source/2841891下载到

从 Visual Basic 创建 ActiveX 控件项目

在 项目 菜单上单击 引用 ,浏览到并添加 Objsafe.tlb,您早先创建的。

添加一个新的模块到您的项目与下面的代码并命名模块 basSafeCtl

Option Explicit

Public Const IID_IDispatch = "{00020400-0000-0000-C000-000000000046}"

Public Const IID_IPersistStorage = _
        "{0000010A-0000-0000-C000-000000000046}"

Public Const IID_IPersistStream = _
        "{00000109-0000-0000-C000-000000000046}"

Public Const IID_IPersistPropertyBag = _
        "{37D84F60-42CB-11CE-8135-00AA004BB851}"

Public Const INTERFACESAFE_FOR_UNTRUSTED_CALLER = &H1

Public Const INTERFACESAFE_FOR_UNTRUSTED_DATA = &H2

Public Const E_NOINTERFACE = &H80004002

Public Const E_FAIL = &H80004005

Public Const MAX_GUIDLEN = 40

Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _
         (pDest As Any, pSource As Any, ByVal ByteLen As Long)

Public Declare Function StringFromGUID2 Lib "ole32.dll" (rguid As _
         Any, ByVal lpstrClsId As Long, ByVal cbMax As Integer) As Long

Public Type udtGUID

Data1 As Long

Data2 As Integer

Data3 As Integer

Data4(7) As Byte

End Type

Public m_fSafeForScripting As Boolean

Public m_fSafeForInitializing As Boolean

Sub Main()

m_fSafeForScripting = True

m_fSafeForInitializing = True

End Sub

在工程属性中把启动对象改成Sub Main确保上述代码会被执行。m_fSafeForScripting 和m_fSafeForInitializing两件变量的值分别指定了脚本安全和初始化安全取值。

打开您的控件的代码窗口。将下面的代码行添加到声明部分中

Implements IObjectSafety

将下面的两个过程复制到您的控件的代码

Private Sub IObjectSafety_GetInterfaceSafetyOptions(ByVal riid As _
      Long, pdwSupportedOptions As Long, pdwEnabledOptions As Long)

Dim Rc      As Long

Dim rClsId  As udtGUID

Dim IID     As String

Dim bIID()  As Byte

pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER Or _
                                INTERFACESAFE_FOR_UNTRUSTED_DATA

If (riid <> 0) Then

CopyMemory rClsId, ByVal riid, Len(rClsId)

bIID = String$(MAX_GUIDLEN, 0)

Rc = StringFromGUID2(rClsId, VarPtr(bIID(0)), MAX_GUIDLEN)

Rc = InStr(1, bIID, vbNullChar) - 1

IID = Left$(UCase(bIID), Rc)

Select Case IID

Case IID_IDispatch

pdwEnabledOptions = IIf(m_fSafeForScripting, _

INTERFACESAFE_FOR_UNTRUSTED_CALLER, 0)

Exit Sub

Case IID_IPersistStorage, IID_IPersistStream, _

IID_IPersistPropertyBag

pdwEnabledOptions = IIf(m_fSafeForInitializing, _

INTERFACESAFE_FOR_UNTRUSTED_DATA, 0)

Exit Sub

Case Else

Err.Raise E_NOINTERFACE

Exit Sub

End Select

End If

End Sub

Private Sub IObjectSafety_SetInterfaceSafetyOptions(ByVal riid As _
      Long, ByVal dwOptionsSetMask As Long, ByVal dwEnabledOptions As Long)

Dim Rc          As Long

Dim rClsId      As udtGUID

Dim IID         As String

Dim bIID()      As Byte

If (riid <> 0) Then

CopyMemory rClsId, ByVal riid, Len(rClsId)

bIID = String$(MAX_GUIDLEN, 0)

Rc = StringFromGUID2(rClsId, VarPtr(bIID(0)), MAX_GUIDLEN)

Rc = InStr(1, bIID, vbNullChar) - 1

IID = Left$(UCase(bIID), Rc)

Select Case IID

Case IID_IDispatch

If ((dwEnabledOptions And dwOptionsSetMask) <> INTERFACESAFE_FOR_UNTRUSTED_CALLER) Then

Err.Raise E_FAIL

Exit Sub

Else

If Not m_fSafeForScripting Then

Err.Raise E_FAIL

End If

Exit Sub

End If

Case IID_IPersistStorage, IID_IPersistStream, IID_IPersistPropertyBag

If ((dwEnabledOptions And dwOptionsSetMask) <> _

INTERFACESAFE_FOR_UNTRUSTED_DATA) Then

Err.Raise E_FAIL

Exit Sub

Else

If Not m_fSafeForInitializing Then

Err.Raise E_FAIL

End If

Exit Sub

End If

Case Else

Err.Raise E_NOINTERFACE

Exit Sub

End Select

End If

End Sub

生成.ocx控件,用web页面引用。控件与页面交互时IE不再提示安全问题。

*继承IObjectSafety接口,实现vb activeX控件安全性(IE不提示安全问题)相关推荐

  1. [转]使用C#开发ActiveX控件全攻略

    先说说ActiveX的基本概念. 根据微软权威的软件开发指南MSDN(Microsoft Developer Network)的定义,ActiveX插件以前也叫做OLE控件或OCX控件,它是一些软件组 ...

  2. C# ActiveX控件开发

    前言: 这段时间因为工作的需要,研究了一下ActiveX控件.总结如下: 先说说ActiveX的基本概念. 根据微软权威的软件开发指南MSDN(Microsoft Developer Network) ...

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

    先说说ActiveX的基本概念. 根据微软权威的软件开发指南MSDN(Microsoft Developer Network)的定义,ActiveX插件以前也叫做OLE控件或OCX控件,它是一些软件组 ...

  4. [转]使用C#开发ActiveX控件

    前言 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动态处理能力.通常ActiveX控件都是 ...

  5. 使用C#开发ActiveX控件(新)

    前言 ActiveX控件以前也叫做OLE控件,它是微软IE支持的一种软件组件或对象,可以将其插入到Web页面中,实现在浏览器端执行动态程序功能,以增强浏览器端的动态处理能力.通常ActiveX控件都是 ...

  6. C#开发B/S方式ActiveX控件

    1. 概念 ActiveX 是一个开放的集成平台,为开发人员. 用户和 Web生产商提供了一个快速而简便的在 Internet 和 Intranet 创建程序集成和内容的方法.使用 ActiveX, ...

  7. 用C#编写ActiveX控件,开发浏览器控件,注册ActiveX 控件

    用C#编写ActiveX控件,开发浏览器控件,注册ActiveX 控件 用C#编写ActiveX控件 开发浏览器控件这是本控件开发完成后的一个简单应用.我们可以利用它以本地文件夹为单位来批量更新服务器 ...

  8. 用C#编写ActiveX控件(二) 转载

    在我的上一篇blog中,已经实现了一个最基本的ActiveX控件.当然,我们编写的任务还没有完成.首先,我们先尝试实现和JS的交互能力.        我们在Demo中加入ShowMessage方法: ...

  9. 关于用C#编写ActiveX控件3(转)

    在我的上一篇blog中,已经实现了一个最基本的ActiveX控件.当然,我们编写的任务还没有完成.首先,我们先尝试实现和JS的交互能力. 我们在Demo中加入ShowMessage方法: public ...

最新文章

  1. c#chart背景透明_C# 二
  2. xml常用操作(js、sql、vb)
  3. min_sample_split 和min_sample_leaf区别
  4. Java Web学习(七)HttpServletResponse(客户端响应)
  5. 【QGIS入门实战精品教程】4.4:QGIS如何将点自动连成线、线生成多边形?
  6. mali GPU 官网指南
  7. mac mysql docker_docker学习(5) 在mac中创建mysql docker容器
  8. 算法学习(四)——alphago模型
  9. 揭秘山寨手机“四寨主”:都高仿苹果iPhone
  10. 阿里、京东、拼多多电商三巨头财报大比拼:拼多多用户数上拼了 京东营收超过阿里...
  11. bzoj 2563阿狸和桃子的游戏
  12. 【拓展】腾讯十大最受欢迎的开源项目!
  13. 如何注册腾讯云账号(图文教程)?
  14. java输入月份获得该年的这个月最后一个工作日是多少号(星期一到星期五)
  15. 新冠病毒又变种了, Lambda病毒比Delta病毒更危险
  16. 如何查看域名所对应的证书有效期?
  17. 经典Excel VBA代码
  18. 三维地图php源码,Three.js实现3D地图实例分享
  19. rundl132.exe,logo1_.exe 病毒专杀工具
  20. Android硬件加速介绍与实现

热门文章

  1. 团队管理之团队气氛篇
  2. 火狐浏览器上的广告过滤插件
  3. k8s之kafka集群重启耗时太长问题
  4. (转)Linux 一句话精彩问答
  5. shell while true if
  6. 4PAM的误码率仿真
  7. javafx控件Button
  8. QT安装段错误segmentation fault
  9. 域名国家工程研究中心(ZDNS)培训认证中心正式成立
  10. 读书笔记009:《伤寒论》- 足太阳膀胱经