自己写的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文件夹的内容.
分享到:
相关推荐
3. **事件处理模块**:控件可能触发某些事件,如OnUsageChange,当CPU使用率发生变化时,开发者可以在事件处理函数中编写相应逻辑,例如记录日志、弹出警告或者执行其他操作。 4. **配置模块**:控件可能提供一些可...
同时,VB的MsgBox函数用于弹出消息提示,向用户显示操作结果或警告信息。 5. 错误处理和调试:在VB中,可以使用On Error语句进行错误处理,确保程序在遇到异常时能够恢复或提供有用的错误信息。开发者可能在关键...
VB可以设计弹出对话框、改变界面颜色等方式提醒用户。 7. **界面设计** VB的拖放式界面设计使得创建用户界面变得简单。在“第5章 电机驱动监控系统”中,可能包含了各种控件的布局和交互逻辑,如按钮、滑块、列表...
通常会弹出一个警告对话框,询问用户是否确定要删除。如果用户确认,系统会执行相应的SQL DELETE语句。 在开发过程中,报告部分可能包括系统设计概述、功能模块描述、错误处理策略以及测试结果等内容。这部分文档...
这里的`onClick`属性定义了当用户点击按钮时执行的VBScript代码,即弹出一个警告框显示消息。 总之,VBScript作为Visual Basic家族的一员,为Web开发提供了强大的脚本能力,其简单易学的特性使其成为初学者和专业...
- 在VB项目中,为了连接到数据库,需要在“工程”菜单下添加“引用”,选择与Access数据库相关的ADODB组件(ActiveX Data Objects),这允许VB与数据库进行交互。 - 同时,添加“部件”以在窗体中使用ADO控件,...
- 安全性问题:由于ActiveX控件的特性,可能会引发安全警告或被现代浏览器或操作系统限制。 - 性能问题:嵌入Office应用程序可能消耗大量系统资源,影响应用性能。 - 兼容性问题:不同版本的Office可能会导致不同的...
报警功能的实现可以多样化,比如弹出警告对话框,发送电子邮件通知,或者通过蜂鸣器、LED灯等硬件设备发出声音或视觉提示。VB提供了多种通知方式,可以根据实际需求选择合适的方法。 此外,为了实现集中和智能化...
2. **用户输入验证**:VB6.0提供了丰富的事件处理机制,例如,可以在CommandButton的Click事件中编写代码,检查TextBox控件中输入的用户名和密码是否为空,如果不满足条件则弹出警告消息。 3. **密码加密**:在实际...
如果为空,则弹出消息框提示用户。 5. **结束文档打印**: 对于每条记录,使用`Printer.EndDoc`方法来结束当前文档的打印过程。 6. **移动到下一条记录**: 通过`Adodc1.Recordset.MoveNext`命令使记录指针移动到下...
如果用户没有选择任何文件,函数会弹出警告消息。对于现代浏览器(如Firefox),可以通过`window.URL.createObjectURL`方法创建一个临时的URL来显示图片预览。而对于旧版的IE浏览器,我们需要使用ActiveX对象和滤镜...
<p><input type="button" value="弹出警告框" onclick="AlertButton()"> function AlertButton() { window.alert("要多多光临呀!"); } ``` **知识点解析:** - **`window.alert()`**: JavaScript内置函数,...