[求助]加载宏时如何关闭不安全控件初始化对话框
本帖最后由 作者 于 2007-5-26 18:59:38 编辑 <br /><br /> <p>加载宏时如何关闭不安全控件初始化对话框?</p><p>网上看到网友翻译的msdn资料,好像只是针对网页控件的,里面有句话“<font color="#bb4b00">可将其功能显露给 Internet Explorer 的“设置脚本安全性”和“设置初始化安全性”安全</font>” ,我试验的acad2002下vba的dvb里面好像无效,有人遇到过吗?</p><p></p><p>(<strong>本文叙述了如何在VB中实现控件的IobjectSafety接口,<br/>以标志该控件是脚本安全和初始化安全的。<br/>VB控件默认的处理方式是在注册表中注册组件类来标识其安全性,<br/>但实现IobjectSafety接口是更好的方法。<br/>本文包括了实现过程中所需的所有代码。</strong></p><p>1、将以下文本复制到记事本, 并作为 objsafe.odl 项目文件夹以保存文件:<br/> [<br/> uuid(C67830E0-D11D-11cf-BD80-00AA00575603),<br/> helpstring("VB IObjectSafety Interface"),<br/> version(1.0)<br/> ]<br/> library IObjectSafetyTLB<br/> {<br/> importlib("stdole2.tlb");<br/> [<br/> uuid(CB5BDC81-93C1-11cf-8F20-00805F2CD064),<br/> helpstring("IObjectSafety Interface"),<br/> odl<br/> ]<br/> interface IObjectSafety:IUnknown {<br/> <br/> HRESULT GetInterfaceSafetyOptions(<br/> long riid,<br/> long *pdwSupportedOptions,<br/> long *pdwEnabledOptions);</p><p> <br/> HRESULT SetInterfaceSafetyOptions(<br/> long riid,<br/> long dwOptionsSetMask,<br/> long dwEnabledOptions);<br/> }<br/> }<br/>---------------------------------------------------------------------<br/>2、在命令提示符处, 使用 CD < 路径 > 命令移到项目文件夹, 然后键入以下命令以生成 .tlb 文件: <br/>MKTYPLIB objsafe.odl /tlb objsafe.tlb<br/>---------------------------------------------------------------------<br/>3、在VB中新建一个ActiveX Control 项目。修改属性,把项目命名为IobjSafety,控件命名为DemoCtl。在控件上放置一个按钮,命名为cmdTest,在它的Click事件中加入一句代码 MsgBox "Test" <br/>---------------------------------------------------------------------<br/>4、在 项目 菜单上, 单击 引用 , 浏览并添加 Objsafe.tlb<br/>---------------------------------------------------------------------<br/>5、项目添加一个新模块并命名模块 basSafeCtl,添加一下代码<br/> Option Explicit</p><p> Public Const IID_IDispatch = "{00020400-0000-0000-C000-000000000046}"<br/> Public Const IID_IPersistStorage = _<br/> "{0000010A-0000-0000-C000-000000000046}"<br/> Public Const IID_IPersistStream = _<br/> "{00000109-0000-0000-C000-000000000046}"<br/> Public Const IID_IPersistPropertyBag = _<br/> "{37D84F60-42CB-11CE-8135-00AA004BB851}"</p><p> Public Const INTERFACESAFE_FOR_UNTRUSTED_CALLER = &H1<br/> Public Const INTERFACESAFE_FOR_UNTRUSTED_DATA = &H2<br/> Public Const E_NOINTERFACE = &H80004002<br/> Public Const E_FAIL = &H80004005<br/> Public Const MAX_GUIDLEN = 40</p><p> Public Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" _<br/> (pDest As Any, pSource As Any, ByVal ByteLen As Long)<br/> Public Declare Function StringFromGUID2 Lib "ole32.dll" (rguid As _<br/> Any, ByVal lpstrClsId As Long, ByVal cbMax As Integer) As Long</p><p> Public Type udtGUID<br/> Data1 As Long<br/> Data2 As Integer<br/> Data3 As Integer<br/> Data4(7) As Byte<br/> End Type</p><p> Public m_fSafeForScripting As Boolean<br/> Public m_fSafeForInitializing As Boolean</p><p> Sub Main()<br/> m_fSafeForScripting = True<br/> m_fSafeForInitializing = True<br/> End Sub<br/>---------------------------------------------------------------------<br/>6、在工程属性中把启动对象改成Sub Main确保上述代码会被执行。m_fSafeForScripting 和m_fSafeForInitializing两件变量的值分别指定了脚本安全和初始化安全取值。<br/>8、打开控件的代码窗口。 将下列行的代码添加到声明部分 (OptionExplicit 后):<br/> Implements IObjectSafety<br/>---------------------------------------------------------------------<br/>9、将下面两个过程复制到控件代码:<br/> Private Sub IObjectSafety_GetInterfaceSafetyOptions(ByVal riid As _<br/> Long, pdwSupportedOptions As Long, pdwEnabledOptions As Long)</p><p> Dim Rc As Long<br/> Dim rClsId As udtGUID<br/> Dim IID As String<br/> Dim bIID() As Byte</p><p> pdwSupportedOptions = INTERFACESAFE_FOR_UNTRUSTED_CALLER Or _<br/> INTERFACESAFE_FOR_UNTRUSTED_DATA</p><p> If (riid <> 0) Then<br/> CopyMemory rClsId, ByVal riid, Len(rClsId)</p><p> bIID = String$(MAX_GUIDLEN, 0)<br/> Rc = StringFromGUID2(rClsId, VarPtr(bIID(0)), MAX_GUIDLEN)<br/> Rc = InStr(1, bIID, vbNullChar) - 1<br/> IID = Left$(UCase(bIID), Rc)</p><p> Select Case IID<br/> Case IID_IDispatch<br/> pdwEnabledOptions = IIf(m_fSafeForScripting, _<br/> INTERFACESAFE_FOR_UNTRUSTED_CALLER, 0)<br/> Exit Sub<br/> Case IID_IPersistStorage, IID_IPersistStream, _<br/> IID_IPersistPropertyBag<br/> pdwEnabledOptions = IIf(m_fSafeForInitializing, _<br/> INTERFACESAFE_FOR_UNTRUSTED_DATA, 0)<br/> Exit Sub<br/> Case Else<br/> Err.Raise E_NOINTERFACE<br/> Exit Sub<br/> End Select<br/> End If<br/> End Sub</p><p> Private Sub IObjectSafety_SetInterfaceSafetyOptions(ByVal riid As _<br/> Long, ByVal dwOptionsSetMask As Long, ByVal dwEnabledOptions As Long)<br/> Dim Rc As Long<br/> Dim rClsId As udtGUID<br/> Dim IID As String<br/> Dim bIID() As Byte</p><p> If (riid <> 0) Then<br/> CopyMemory rClsId, ByVal riid, Len(rClsId)</p><p> bIID = String$(MAX_GUIDLEN, 0)<br/> Rc = StringFromGUID2(rClsId, VarPtr(bIID(0)), MAX_GUIDLEN)<br/> Rc = InStr(1, bIID, vbNullChar) - 1<br/> IID = Left$(UCase(bIID), Rc)</p><p> Select Case IID<br/> Case IID_IDispatch<br/> If ((dwEnabledOptions And dwOptionsSetMask) <> _<br/> INTERFACESAFE_FOR_UNTRUSTED_CALLER) Then<br/> Err.Raise E_FAIL<br/> Exit Sub<br/> Else<br/> If Not m_fSafeForScripting Then<br/> Err.Raise E_FAIL<br/> End If<br/> Exit Sub<br/> End If</p><p> Case IID_IPersistStorage, IID_IPersistStream, _<br/> IID_IPersistPropertyBag<br/> If ((dwEnabledOptions And dwOptionsSetMask) <> _<br/> INTERFACESAFE_FOR_UNTRUSTED_DATA) Then<br/> Err.Raise E_FAIL<br/> Exit Sub<br/> Else<br/> If Not m_fSafeForInitializing Then<br/> Err.Raise E_FAIL<br/> End If<br/> Exit Sub<br/> End If</p><p> Case Else<br/> Err.Raise E_NOINTERFACE<br/> Exit Sub<br/> End Select<br/> End If<br/> End Sub<br/>---------------------------------------------------------------------<br/>10、在 文件 菜单上, 保存您的项目和文件。 生成 OCX 文件从项目。 现在您控件实现 IObjectSafety 接口。 要测试, 在一个 .htm 文件中插入控件。</p><p></p><p>相关连接:<br/><a href="http://topic.csdn.net/t/20050104/23/3699426.html">http://topic.csdn.net/t/20050104/23/3699426.html</a> 原理<br/> IObjectSafety 是一个接口<font color="#ff0000" size="4">,<u>它可将其功能显露给 Internet Explorer 的“设置脚本安全性”和“设置初始化安全性”安全特性</u></font>。对具有支持未受托客户(或那些不能预料其特定功能的,或不能确保安全使用的客户)接口的对象,例如脚本,应当实现 IObjectSafety 接口。该接口允许您指定对象的哪一部分需要保护而不被使用。 <br/>--------------------------------------------------------------------- <br/> 使用 IObjectSafety 可以将对象及其组成部分标记为以下三类:<br/> 1、对未受托的 Automation 客户和脚本设置 Automation 安全性<br/> 2、对未受托数据设置初始化安全性<br/> 3、对未受托脚本设置运行安全性<br/>---------------------------------------------------------------------<br/>可以为您的对象考虑三种方案:<br/> 1、 对象的所有属性和方法总是设置脚本安全性的。在该方案中,您可以通过不在IObjectSafety_SetInterfaceSafetyOptions 接口方法中返回错误来通知客户您的对象设置了脚本安全性。这样就能成功地创建和运行您的对象了。<br/> 2、对象永不设置脚本安全性。在这种情况下,您可以通过在 IObjectSafety_SetInterfaceSafetyOptions 接口方法中返回一个错误,E_Fail 来通知客户您的对象不安全。这样就防止了客户通过脚本来访问任何方法或属性了<br/> 3、对象上的部分属性和方法,但不是全部,未设置脚本安全性。在这种情况下,您可以通知客户整个对象都不安全,也可以通知客户您的对象是安全的,但禁用不安全的属性和方法。<br/>--------------------------------------------------------------------<br/>TLB用于定义接口. <br/> Implements 在VB中继承并实现定义的 接口. <br/> IObjectSafety_GetInterfaceSafetyOptions <br/> IObjectSafety_SetInterfaceSafetyOptions <br/> 是定义IObjectSafety的一个InterfaceSafetyOptions属性.要做的动作.<br/>--------------------------------------------------------------------<br/>[ <br/> uuid(C67830E0-D11D-11cf-BD80-00AA00575603), <br/> helpstring("VB IObjectSafety Interface"), <br/> version(1.0) <br/> ] <br/> <br/> 这是接口定义语言(IDL:Interface Definition Language),C67830E0-D11D-11cf-BD80-00AA00575603不可以任意写,它代表了IObjectSafety这个接口,改了别人就找不到它了,如果创建一个新的类或接口,则可以任意写,就是一组16进制数,但一般都用GUIDGEN.EXE生成,可以保证不重复<br/>===============================================================================</p><p></p> <p>斑竹老大帮忙研究一下好吗?</p>
页:
[1]