1

我正在使用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 控件的适当文档?由于这个错误,我目前的开发处于停滞状态。

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

4

3 回答 3

1

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

  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 条目,也没有替代类ID。

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

注册表项是:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Internet Explorer\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>
于 2010-03-15T12:30:16.647 回答
1

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

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

有关更多信息,请参阅本文

--编辑

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

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

于 2009-10-23T15:10:26.693 回答
0

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

Dim objComDlg As Object : Set objComDlg = CreateObject("MSComDlg.CommonDialog")
于 2009-07-18T06:49:58.443 回答