ComDlg32.ocx错误:对象不支持此属性或方法

时间:2009-07-18 06:31:23

标签: comdlg32

我正在使用 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进行开发。

3 个答案:

答案 0 :(得分:1)

听起来您的问题可能与MS对OCX库进行的一些重大更改有关,以修复控件中的各种安全漏洞。我注意到你正在运行SP3,这可能包括修复程序,它们似乎对控件产生了连锁反应,例如:有些方法已经消失了!

我遇到了同样的问题 - 在msflxgrd.ocs(Rows方法)上的遗留应用程序中调用了一个方法,该方法似乎不存在。花了我很少的时间找到解决方案。我的猜测是你需要回滚安全更新,或者更改你的代码以不使用缺少的objComDlg.Filter方法。

有关详细信息,请参阅this article

- 编辑

好的我现在有一些更具体的信息,这对我有用(除了我的问题是msflxgrd.ocx,但我认为这是同样的问题)。

有一个特定的微软更新(KB960715),它在ActiveX控件中插入了一些漏洞,因此易受攻击的方法仍然存在于控件中但被killbits阻止。删除更新已经解决了我的问题,显然如果你可以更好地更改你的代码,因为删除更新会使你容易受到旨在修复它的攻击!

答案 1 :(得分:1)

我遇到了完全相同的问题,但它只发生在某些机器上。我设法通过以下步骤重新创建问题:

  1. 使用Microsoft Virtual PC 2007,安装一个干净的XP Pro版本。
  2. 除了VM Addons之外,不安装任何其他内容,请应用所有MS更新。
  3. 如上所述运行代码。我也在下面提供了另一种选择。
  4. 似乎问题是通过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")