`
jackeysion
  • 浏览: 129554 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

vb写的activex控件不再弹出警告提示

阅读更多
自己写的activex控件总是提示"在此页上的activex控件和本页上其他部分的交互可能不安全,你想允许这种交互吗?" . 比较烦人,而且提示完之后ie就死了.

在网上搜了好久终于找到了解决办法,就是网上说的比较多的那种方法,实现IObjectSafety接口
其实网上的那种方式是可用的,在此再记录一下,也希望对没有解决此问题的朋友有帮助.

1.创建一个文件夹,复制下述代码
[
          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);
           }
       }


将上面这段代码复制下来,在新建的文件夹中用记事本建立一个文件,将代码粘贴进去,然后将文件名改为objsafe.odl(一定要是odl格式的).

2.在vb的安装盘上,有个COMMON\TOOLS\VB\UNSUPPRT\TYPLIB所有的文件拷贝到新建的文件夹中. 双击运行其中的MKTYPLIB.EXE(最好不要在命令行下运行,命令行下运行的可能会报错) , 会提示选择odl文件,选择刚才建立的那个objsafe.odl文件,然后就可以创建出objsafe.tlb文件(备用)

3.下面开始做activex控件.
  打开vb6,新建一个activex 控件(英文版的activex control)工程 ,
  默认会有一个类似窗体的UserControl1控件.
  建议最好改一下名,如将工程名改为TestPro,将控件名改为TestControl.
  菜单: 工程---引用  点击浏览,找到刚才创建的objsafe.tlb 确定.
  在工程上 右键 添加模块 , 创建一个名为basSafeCtl.bas的模块,并将下面的代码复制到模块中.
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



双击控件(TestControl),
在代码区的声明部分添加:
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_IPersistPropertyBags
                      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



4.  然后,在 菜单: 工程 --- Test属性(即本工程的属性) 里 ,通用tab页中,将启动对象选择为Sub Main , 确保自己添加的模块能被运行到.
  然后可以自己在控件中加一个按钮 ,并在按钮事件中弹出一条信息 MsgBox("test")
5. 生成ocx(文件---生成Test.ocx) 并注册(regsvr32 路径\Test.ocx)

6. 写一个html页面进行测试

就不会出现烦人的 提示框了.

附上 vb 安装目录下的 typlib文件夹的内容.
分享到:
评论

相关推荐

    VB CPU使用监控控件 ActiveX控件

    3. **事件处理模块**:控件可能触发某些事件,如OnUsageChange,当CPU使用率发生变化时,开发者可以在事件处理函数中编写相应逻辑,例如记录日志、弹出警告或者执行其他操作。 4. **配置模块**:控件可能提供一些可...

    VCD租借管理系统VB(源程序+论文).rar

    同时,VB的MsgBox函数用于弹出消息提示,向用户显示操作结果或警告信息。 5. 错误处理和调试:在VB中,可以使用On Error语句进行错误处理,确保程序在遇到异常时能够恢复或提供有用的错误信息。开发者可能在关键...

    vb做的电机驱动监控系统源码

    VB可以设计弹出对话框、改变界面颜色等方式提醒用户。 7. **界面设计** VB的拖放式界面设计使得创建用户界面变得简单。在“第5章 电机驱动监控系统”中,可能包含了各种控件的布局和交互逻辑,如按钮、滑块、列表...

    学生资料信息管理VB.........

    通常会弹出一个警告对话框,询问用户是否确定要删除。如果用户确认,系统会执行相应的SQL DELETE语句。 在开发过程中,报告部分可能包括系统设计概述、功能模块描述、错误处理策略以及测试结果等内容。这部分文档...

    vb的一些相关重要基本语法

    这里的`onClick`属性定义了当用户点击按钮时执行的VBScript代码,即弹出一个警告框显示消息。 总之,VBScript作为Visual Basic家族的一员,为Web开发提供了强大的脚本能力,其简单易学的特性使其成为初学者和专业...

    VB连接数据库(登录).pdf

    - 在VB项目中,为了连接到数据库,需要在“工程”菜单下添加“引用”,选择与Access数据库相关的ADODB组件(ActiveX Data Objects),这允许VB与数据库进行交互。 - 同时,添加“部件”以在窗体中使用ADO控件,...

    c#开发,winform中嵌入office,使用到DSO Framer。

    - 安全性问题:由于ActiveX控件的特性,可能会引发安全警告或被现代浏览器或操作系统限制。 - 性能问题:嵌入Office应用程序可能消耗大量系统资源,影响应用性能。 - 兼容性问题:不同版本的Office可能会导致不同的...

    利用Visual Basic实现温度测量与报警控制

    报警功能的实现可以多样化,比如弹出警告对话框,发送电子邮件通知,或者通过蜂鸣器、LED灯等硬件设备发出声音或视觉提示。VB提供了多种通知方式,可以根据实际需求选择合适的方法。 此外,为了实现集中和智能化...

    登录框算密操作源代码2023-10-18-20-02.zip

    2. **用户输入验证**:VB6.0提供了丰富的事件处理机制,例如,可以在CommandButton的Click事件中编写代码,检查TextBox控件中输入的用户名和密码是否为空,如果不满足条件则弹出警告消息。 3. **密码加密**:在实际...

    批量打印数据库照片源代码

    如果为空,则弹出消息框提示用户。 5. **结束文档打印**: 对于每条记录,使用`Printer.EndDoc`方法来结束当前文档的打印过程。 6. **移动到下一条记录**: 通过`Adodc1.Recordset.MoveNext`命令使记录指针移动到下...

    基于ASP.NET+easyUI框架实现图片上传功能(表单)

    如果用户没有选择任何文件,函数会弹出警告消息。对于现代浏览器(如Firefox),可以通过`window.URL.createObjectURL`方法创建一个临时的URL来显示图片预览。而对于旧版的IE浏览器,我们需要使用ActiveX对象和滤镜...

    asp编程中常用的javascript辅助代码第1/2页

    &lt;p&gt;&lt;input type="button" value="弹出警告框" onclick="AlertButton()"&gt; function AlertButton() { window.alert("要多多光临呀!"); } ``` **知识点解析:** - **`window.alert()`**: JavaScript内置函数,...

Global site tag (gtag.js) - Google Analytics