Ошибка ComDlg32.ocx: объект не поддерживает это свойство или метод - PullRequest
1 голос
/ 18 июля 2009

Я разрабатываю 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 голос
/ 23 октября 2009

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

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

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

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

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

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

1 голос
/ 15 марта 2010

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

  1. Используя Microsoft Virtual PC 2007, установите чистую сборку XP Pro.
  2. Не устанавливая ничего, кроме надстроек ВМ, примените все обновления MS.
  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 \ 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>
0 голосов
/ 18 июля 2009

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

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