全文转载,以备不时之需.
如何在VB中实现ActiveX控件的IobjectSafety接口 选择自 foolishtiger 的 Blog
http://support.microsoft.com/default.aspx?scid=kb;EN-US;q182598
如何在VB中实现ActiveX控件的IobjectSafety接口
--------------------------------------------------------------------------------
总述
本文叙述了如何在VB中实现控件的IobjectSafety接口,以标志该控件是脚本安全和初始化安全的。VB控件默认的处理方式是在注册表中注册组件类来标识其安全性,但实现IobjectSafety接口是更好的方法。本言语包括了实现过程中所需的所有代码。
请注意,控件只有确确实实是安全的,才能被标识为“安全的”。本文并未论及如何确保控件的安全性,这个问题请参阅Internet Client Software Development Kit (SDK)中的相关文档 "Safe Initialization and Scripting for ActiveX Controls",它在Component Development 栏目中。
相关信息:
<此处略去了一段也许无关紧要的警告>
现在开始循序渐进地举例说明怎样创建一个简单的VB控件,以及怎样将它标识为脚本安全和初始化安全。
首先新建一个文件夹来存放在本例中所产生的文件。
从VB CD-ROM取得OLE 自动化类库的制作工具。将VB安装光盘中\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);
}
}
在命令行提示符下切换到项目文件夹,输入下列命令创建一个.tlb 文件:
MKTYPLIB objsafe.odl /tlb objsafe.tlb
在VB中新建一个ActiveX Control 项目。修改属性,把项目命名为IobjSafety,控件命名为DemoCtl。在控件上放置一个按钮,命名为cmdTest,在它的Click事件中加入一句代码 MsgBox "Test" 。
打开菜单“工程->引用”,点“浏览”,找到刚刚建立的Objsafe.tlb,把它加入到引用中。
增加一个新module名为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两件变量的值分别指定了脚本安全和初始化安全取值。
打开控件代码窗口,在声明部分加入如下代码(如果有Option Explicit语句,当然要保证代码放在其后):
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文件。现在控件已经实现了IObjectSafety 接口。在.htm中加入这件控件试一试吧。
作者Blog:http://blog.csdn.net/foolishtiger/
相关文章
PDA下应用EVB开发的几点问题
如何在VB中实现ActiveX控件的IobjectSafety接口
VB中文件操作的两种方式
附带上 证书制作工具 , 打包工具( need JDK - -!)
分享到:
相关推荐
期货大词典:期现货人士必收藏,以备不时之需.doc
VirtualBox-6.1.2-135663-Win.exe 官网下载很慢很慢,备份到这里以备不时之需. VirtualBox-6.1.2-135663-Win.exe 官网下载很慢很慢,备份到这里以备不时之需. VirtualBox-6.1.2-135663-Win.exe 官网下载很慢很慢,...
万能驱动器,可在线升级,下载了以备不时之需。
本篇将围绕"实现table排序(以备不时之需)"这一主题,详细讲解如何利用jQuery及其插件来实现表格数据的动态排序。 首先,我们看到标签中提到了"源码"和"工具",这意味着我们将探讨一段具体的代码和可能使用的工具...
取消选取文本以防止复制 ```html ``` 设置 `onselectstart` 事件可以阻止用户选中文本进行复制,这对于保护版权内容非常有用。 ### 3. 阻止粘贴操作 ```javascript onpaste="return false" ``` 此属性可以禁止...
源地址下载缓慢,上传到这里备份,以备不时之需.
H3C
滤波电路是电子工程中的重要组成部分,特别是在单片机、嵌入式系统、...无论是硬件工程师在设计新产品时,还是学生在学习电路分析时,都需要深入理解和掌握滤波电路的工作原理和应用技巧,以应对不断变化的技术挑战。
//技巧 所谓$表示以什么结尾,应当是排除了^部分后剩下的 //技巧 要匹配一个固定的数则直接 写就可以.如果要匹配一个字母则 \a \.这样. //技巧 +号表示(1-多) *号表示(0-多) ?号表示(0-1) //验证一个ip...
eXeScope专业脱壳工具,方便大家使用,以备不时之需. 是一款专业的编程软件,exescope 汉化版小巧但功能极其强大的本地化工具,exescope可以直接修改 VC++ 及 DELPHI 编制的 PE 格式文件的资源,包括菜单、对话框、...
描述中提到的“收藏图片”和“收集一些好看的图片,以备不时之需”暗示了这是一个图片储备库,用户可以在需要的时候从中挑选合适的图片。目录部分提到的“背景”可能指的是项目设立的初衷或者是图片分类的一种,比如...
配备小型灭火器和防火逃生工具,以备不时之需。 5. 厨房用电安全:避免湿手接触电器,电源保险丝不可用铜丝替代,应使用适合的保险丝。灯头使用螺口并安装安全罩,可移动电器使用后拔掉插头,避免长时间通电。 6. ...
【后备干部培养计划详解】 ...这个后备干部培养计划是一个系统性、全面性的策略,它不仅关注人才的选拔,还重视人才的长期发展,通过多种途径提升后备干部的综合素质,以备不时之需,从而保障企业的稳定和长远发展。
1.4.1 备份:备份是将数据和应用程序的当前状态复制到另一个存储介质或地点,以备不时之需。常见的备份策略有全量备份、增量备份和差异备份。 1.4.2 容灾:容灾系统是在主系统之外建立的,可以在灾难发生时立即接替...
3. 身份证及其复印件:正反两面各复印4份,以备不时之需。 4. 户口本复印件:户主页和本人页各4份,部分学校可能会要求。 5. 团员档案和学籍档案:这两项非常重要,不要忘记带上,且学籍档案不能开封。 6. 免冠照片...
传一下jar包,找不到jar包时就下载吧,方便大家不时之需.
其工作原理是在电脑中建立一个虚拟声卡,从而对电脑中的任何声音进行截取,其效果非常好,下载之后安装即可,目前本人用了很久但一直没发现需要注册激活,不过,为了防止万一,现提供几组可注册数据,以备不时之需!...
8. **扩展性**:CocosBuilder允许开发者通过插件扩展其功能,以满足特定项目需求,如添加自定义的行为或特效。 9. **版本控制**:作为一个重要的备份,CocosBuilder3.5.zip可能包含版本控制信息,这使得团队协作和...
12. 鞋子:至少两双,以备不时之需。 13. 夹衣架:寝室共享,数量宜多。 14. 粘钩:用于晾晒衣物或挂置物品。 15. 吹风机:虽是违规电器,但在雨季非常有用,可谨慎使用。 这份清单旨在帮助新生全面考虑所需物品,...
SqlLocalDB.msi sqlserver数据库。20180821上传一份,以备不时之需