我正在使用 ComDlg32.ocx (Commom Dialog Control)开发一个html编辑器,使用HTML和 VBScript 。我的确切要求是提示打开/保存/颜色/打印/字体对话框。我已经编写了提示保存文件对话框的代码。我还在我的网页上添加了使用LPK工具的许可证文件。
我的html源代码如下:
<body>
<!-- lpk file -->
<object classid="clsid:5220cb21-c88d-11cf-b347-00aa00a28331">
<param name="LPKPath" value="License/comdlg.lpk" />
</object>
<!-- Microsoft Common Dialog Control -->
<object classid="CLSID:F9043C85-F6F2-101A-A3C9-08002B2F49FB" codebase="http://activex.microsoft.com/controls/vb6/COMDLG32.CAB" id="objComDlg"></object>
</body>
现在,我的错误就出现了。每当我尝试调用vbscript以提示“保存文件”对话框时,我收到的错误如下: 对象不支持此属性或方法:'objComDlg.Filter'
如果我注释掉了 objComDlg.Filter ,则错误会转移到 objComDlg.DialogTitle ,因此会继续。
我的VBScript看起来像:
FILE_FORMATS = "Rich Text Format (*.rtf)|*.rtf|Microsoft Word (*.doc)|*.doc|ANSI Text Document (*.txt)|*.txt"
objComDlg.Filter = FILE_FORMATS <--- Error shows here
objComDlg.DialogTitle = "Save As "
objComDlg.Flags = cdlOFNFileMustExist Or cdlOFNHideReadOnly
objComDlg.CancelError = True
objComDlg.ShowSave
有谁知道为什么会这样?是否有任何适当的文档使用这个特定的ActiveX控件?由于这个错误,我当前的发展处于停滞状态。
BTW,我正在使用Windows XP SP3和IE8进行开发。
答案 0 :(得分:1)
听起来您的问题可能与MS对OCX库进行的一些重大更改有关,以修复控件中的各种安全漏洞。我注意到你正在运行SP3,这可能包括修复程序,它们似乎对控件产生了连锁反应,例如:有些方法已经消失了!
我遇到了同样的问题 - 在msflxgrd.ocs(Rows方法)上的遗留应用程序中调用了一个方法,该方法似乎不存在。花了我很少的时间找到解决方案。我的猜测是你需要回滚安全更新,或者更改你的代码以不使用缺少的objComDlg.Filter方法。
有关详细信息,请参阅this article。
- 编辑
好的我现在有一些更具体的信息,这对我有用(除了我的问题是msflxgrd.ocx,但我认为这是同样的问题)。
有一个特定的微软更新(KB960715),它在ActiveX控件中插入了一些漏洞,因此易受攻击的方法仍然存在于控件中但被killbits阻止。删除更新已经解决了我的问题,显然如果你可以更好地更改你的代码,因为删除更新会使你容易受到旨在修复它的攻击!
答案 1 :(得分:1)
我遇到了完全相同的问题,但它只发生在某些机器上。我设法通过以下步骤重新创建问题:
似乎问题是通过MS更新发生的。使用KB240797知识库文章(http://support.microsoft.com/default.aspx/kb/240797?p=1),我能够确定已为Common Dialog ActiveX控件发出了一个kill bit,并提供了另一个类ID(8F0F480A-4366-4737-8265-2AD6FDAC8C31) ,表明该控件已被取代。但是,在检查了控制工作的其他机器之后,特别是开发机器(XP Pro x64,XP Pro x32和Vista x32),每个都安装了Visual Studio 2008的副本,没有杀死位进入,也没有替代方案班级ID。
要使对话框正常工作,我只需重命名注册表项(我本可以删除它),这意味着不再有一个kill bit。嘿presto,它工作!
注册表项是:
HKEY_LOCAL_MACHINE \ SOFTWARE \微软\互联网 资源管理器\的ActiveX 兼容性{F9043C85-F6F2-101A-A3C9-08002B2F49FB}
我想有可能会在未来的Microsoft累积更新中重新应用此功能,并且可能还会出现一些安全漏洞。
我希望这会对你有所帮助。感谢您的原始帖子,因为它似乎让我走上正轨。
凯恩
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<title>Common Dialog Test</title>
<script language="vbscript" type="text/vbscript">
Sub AlertErr()
On Error Resume Next
document.objComDlg.Copies = 1
document.objComDlg.FromPage = 1
document.objComDlg.ToPage = 1
document.objComDlg.Min = 1
document.objComDlg.Max = 1
document.objComDlg.Flags = cdlPDHidePrintToFile Or cdlPDNoSelection
document.objComDlg.CancelError = True
printerDialog = document.objComDlg.ShowPrinter
If Err.Number = 0 Then
Call MsgBox("No Error. The print simulation worked as expected.")
ElseIf Err.Number = 32755 Then
Call MsgBox("You clicked the 'Cancel' button.")
Else
Call MsgBox("The following error occurred: " & Err.Description & " (" & Err.Number & ")")
End If
End Sub
</script>
</head>
<body>
<div>
<button id="btnAlertErr" onclick="AlertErr()">Print Me</button>
<object classid="clsid:5220cb21-c88d-11cf-b347-00aa00a28331">
<param name="LPKPath" value="CommonDialog.lpk">
</object>
<object id="objComDlg" codebase="http://activex.microsoft.com/controls/vb6/comdlg32.cab" classid="clsid:F9043C85-F6F2-101A-A3C9-08002B2F49FB" viewastext>
<param name="_ExtentX" value="847" />
<param name="_ExtentY" value="847" />
<param name="_Version" value="393216" />
<param name="_Version" value="393216" />
<param name="CancelError" value="0" />
<param name="Color" value="0" />
<param name="Copies" value="1" />
<param name="DefaultExt" value="" />
<param name="DialogTitle" value="" />
<param name="FileName" value="" />
<param name="Filter" value="" />
<param name="FilterIndex" value="0" />
<param name="Flags" value="0" />
<param name="FontBold" value="0" />
<param name="FontItalic" value="0" />
<param name="FontName" value="" />
<param name="FontSize" value="8" />
<param name="FontStrikeThru" value="0" />
<param name="FontUnderLine" value="0" />
<param name="FromPage" value="0" />
<param name="HelpCommand" value="0" />
<param name="HelpContext" value="0" />
<param name="HelpFile" value="" />
<param name="HelpKey" value="" />
<param name="InitDir" value="" />
<param name="Max" value="0" />
<param name="Min" value="0" />
<param name="MaxFileSize" value="260" />
<param name="PrinterDefault" value="1" />
<param name="ToPage" value="0" />
<param name="Orientation" value="1" />
</object>
</div>
</body>
</html>
答案 2 :(得分:0)
你在你发布的VBscript上面创建你的objComDlg吗?类似的东西:
Dim objComDlg As Object : Set objComDlg = CreateObject("MSComDlg.CommonDialog")