在Web组件中实现IObjectSafety

ZDNet软件频道 时间:2004-04-02 作者:Builder.com |  我要评论()
本文关键词:
在基于Web的解决方案中,如果需要与自定义的客户端组件协作,那么为企业内部网(intranet)系统进行程序设计就变成了一个颇具争议性的话题。
本文译自Builder.com,未经许可请勿转载

在基于Web的解决方案中,如果需要与自定义的客户端组件协作,那么为企业内部网(intranet)系统进行程序设计就变成了一个颇具争议性的话题。一个实现方法是降低浏览器的安全设置级别,允许没有标记为安全可执行脚本的组件能够执行脚本。

安全性一直都是一个问题,尤其是在企业系统内部。通过将你的组件标记为安全可执行脚本就可以在你的解决方案中增加额外的安全层。最后一层将是对你的组件的数字签名,但是对于本地企业内部网解决方案来说,这似乎有点没有必要。

Internet Explorer(IE)使用两种方法来检查组件是否可安全可执行脚本。一个方法是在注册表中检查组件的类别(这是在包和部署向导将组件标记为安全可执行脚本所使用的默认方法)。另外一种方法是查询组件的IObjectSafety接口。在你的组件中实现IObjectSafety接口是将组件标记为安全可执行脚本和初始化的较好的方法。(我建议你访问微软的Web站点阅读更多有关安全执行脚本的信息。)

该方法的第一步是将位于Visual Basic安装盘中CommonToolsVBUnsupprtTyplib文件夹下的四个文件拷贝到你的开发目录中。然后,使用下面的文本创建ODL文件(可以使用记事本之类的ASCII文件编辑器来创建)。

[
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);
}
}

将该文件保存在你的项目文件夹中,文件名为Safeobject.odl。在MS-DOS命令行窗口下,进入你的项目目录然后键入mktyplib safeobject.odl /tlb safeobject.tlb。这样将创建一个类型库,之后在Visual Basic项目中将会创建一个对它的引用。创建引用的方法是:选择Project菜单下的References,然后使用Browse按钮在项目文件夹下定位Safeobject.tlb文件。

现在,创建一个Visual Basic ActiveX DLL项目。添加一个标准模块,然后将下面的代码添加到这个新模块中:

Option Explicit

Public Const IID_IDispatch = ""
Public Const IID_IPersistStorage = ""
Public Const IID_IPersistStream = ""
Public Const IID_IPersistPropertyBag = ""

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
D1 As Long
D2 As Integer
D3 As Integer
D4(7) As Byte
End Type

Public m_fScriptSafe As Boolean
Public m_fInitializeSafe As Boolean

Sub Main()
m_fScriptSafe = True
m_fInitializeSafe = True
End Sub


百度大联盟认证黄金会员Copyright© 1997- CNET Networks 版权所有。 ZDNet 是CNET Networks公司注册服务商标。
中华人民共和国电信与信息服务业务经营许可证编号:京ICP证010391号 京ICP备09041801号-159
京公网安备:1101082134