【问题标题】:ComDlg32.ocx Error: Object doesn't support this property or methodComDlg32.ocx 错误:对象不支持此属性或方法
【发布时间】:2009-07-18 06:31:22
【问题描述】:

我正在开发一个使用 ComDlg32.ocx(Commom Dialog Control)、使用 HTML 和 VBScript 的 html 编辑器。我的确切要求是提示打开/保存/颜色/打印/字体对话框。我编写了提示保存文件对话框的代码。我还在网页上添加了使用 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 控件的适当文档?由于这个错误,我目前的开发处于停滞状态。

顺便说一句,我正在使用 Windows XP SP3 和 IE8 进行开发。

【问题讨论】:

    标签: comdlg32


    【解决方案1】:

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

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

    请参阅this article 了解更多信息。

    -- 编辑

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

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

    【讨论】:

    • 您好,感谢您的回复。我在 MSDN 和 Technet 论坛中升级了同样的问题。但是,我也没有得到任何积极的回应。也没有人提到 Win XP SP3 的问题。我想知道为什么他们无法提供任何解决方案。哼!谢谢。
    • 我已经用更多信息更新了我的答案,尝试卸载 KB960715 看看会发生什么
    【解决方案2】:

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

    1. 使用 Microsoft Virtual PC 2007,安装全新版本的 XP Pro。
    2. 不安装任何其他东西,除了 VM 插件,应用所有的 MS 更新。
    3. 如上所述运行代码。我也在下面提供了一个替代方案。

    问题似乎是通过 MS 更新发生的。使用 KB240797 知识库文章 (http://support.microsoft.com/default.aspx/kb/240797?p=1),我能够确定已为 Common Dialog ActiveX 控件发出了终止位,并提供了替代类 ID (8F0F480A-4366-4737-8265-2AD6FDAC8C31),这表明控制已被取代。然而,在检查了控制工作的其他机器,特别是开发机器(XP Pro x64、XP Pro x32 和 Vista x32)之后,每台机器都安装了 Visual Studio 2008 的副本,没有 kill bit 条目,也没有替代类身份证。

    为了让对话框正常工作,我只是重命名了注册表项(我也可以删除它),这意味着不再有kill bit。嘿,很快,它成功了!

    注册表项是:

    HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet 资源管理器\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>
    

    【讨论】:

      【解决方案3】:

      您是否在发布的 VBscript 之上创建了 objComDlg?比如:

      Dim objComDlg As Object : Set objComDlg = CreateObject("MSComDlg.CommonDialog")
      

      【讨论】:

      • 我稍微修改了上面的代码。 Dim objComDlg Set objComDlg = CreateObject("MSComDlg.CommonDialog")
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-08-25
      • 1970-01-01
      • 2011-02-14
      • 1970-01-01
      • 2013-10-05
      • 1970-01-01
      相关资源
      最近更新 更多