Ошибка ComDlg32.ocx: объект не поддерживает это свойство или метод

Я разрабатываю HTML-редактор, используя ComDlg32.ocx (Commom Dialog Control), используя HTML и VBScript. Мое точное требование состояло в том, чтобы предложить диалоговые окна Открыть / Сохранить / Цвет / Печать / Шрифт. Я написал код для запроса диалогового окна Сохранить файл. Также я добавил файл лицензии с помощью LPK Tool на свою веб-страницу.

Мой 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 для моей разработки.

3 ответа

У меня была точно такая же проблема, но она возникает только на определенных машинах. Мне удалось воссоздать проблему с помощью следующих шагов:

  1. Используя Microsoft Virtual PC 2007, установите чистую сборку XP Pro.
  2. Не устанавливая ничего, кроме VM Addons, примените все MS Updates.
  3. Запустите код, как описано выше. Я также предоставил альтернативу ниже.

Казалось бы, проблема произошла через обновление MS. Используя статью базы знаний KB240797 ( http://support.microsoft.com/default.aspx/kb/240797?p=1), я смог определить, что был выдан бит уничтожения для элемента управления Active Dialog Common Dialog, и предоставлен альтернативный идентификатор класса (8F0F480A-4366-4737-8265-2AD6FDAC8C31), свидетельствующий о замене элемента управления. Однако после проверки других машин, на которых работал элемент управления, в частности машин разработки (XP Pro x64, XP Pro x32 и Vista x32), на каждой из которых была установлена ​​копия Visual Studio 2008, не было ни одной записи битов уничтожения, и альтернативного класса не было. Я БЫ.

Чтобы заставить диалог работать, я просто переименовал раздел реестра (я мог бы также удалить его), означая, что бит уничтожения больше не существует. Эй, Presto, это сработало!

Раздел реестра:

HKEY_LOCAL_MACHINE \ ПРОГРАММНОЕ ОБЕСПЕЧЕНИЕ \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>

Похоже, что ваша проблема может быть связана с некоторыми серьезными изменениями, внесенными MS в библиотеки OCX, чтобы исправить различные дыры в безопасности элементов управления. Я заметил, что вы используете SP3, это, вероятно, включало исправления, которые, по-видимому, оказывали на элементы управления ударные эффекты, например, некоторые методы исчезли!

Я столкнулся с той же проблемой - метод вызывался в унаследованном приложении на msflxgrd.ocs (метод Rows), который, по-видимому, не существовал. Мне понадобилось много времени, чтобы найти решение. Я думаю, вам нужно либо откатить обновление безопасности, либо изменить свой код, чтобы не использовать этот отсутствующий метод objComDlg.Filter.

Смотрите эту статью для получения дополнительной информации.

- РЕДАКТИРОВАТЬ

ОК, теперь у меня есть более конкретная информация, это сработало для меня (за исключением того, что моя проблема была с msflxgrd.ocx, но я думаю, что это та же проблема).

Существует специальное обновление для Microsoft ( KB960715), в котором есть некоторые дыры в элементах управления ActiveX, поэтому уязвимые методы все еще присутствуют в элементах управления, но блокируются битами аннулирования. Удаление обновления решило мою проблему, очевидно, если бы вы могли, было бы лучше изменить ваш код, потому что удаление обновления делает вас уязвимым для эксплойтов, для которых оно было разработано!

Вы создаете свой objComDlg над VBscript, который вы опубликовали? Что-то вроде:

Dim objComDlg As Object : Set objComDlg = CreateObject("MSComDlg.CommonDialog")
Другие вопросы по тегам