1 (изменено: abasov, 2009-12-10 12:52:59)

Тема: VBS: диалоговое окно выбора файла в windows vista & 7

Оказывается, в vista & 7 не работает dialogbox. Окошко выбора можно получить только из объекта "InternetExplorer.Application"

SAFRCFileDlg - не работает
Shell.Application - не работает
UserAccounts.CommonDialog - не работает (ключик регистрировал в реестре)


Вопрос остается открытым не только для меня: blogs.technet.com

Здесь поясняется использование диалоговых окон в работе с файлами, но мне пока не ясно как можно применить сие.

На счет висты не уверен, проверить нет возможности, проверял только на 7

2

Re: VBS: диалоговое окно выбора файла в windows vista & 7

2abasov: маты про Vista и ушедшие в связи с этим объекты «SAFRCFileDlg.FileSave/FileOpen» и «UserAccounts.CommonDialog» (а, судя по описанию, их нет и в ветке Servers) читал в technet. Вы точно такой метод пробовали: VBS. Вызов стандартного окна выбора файла в Windows Vista ?, бо там сказано, что «Shell.Application» — работает (там, правда, только «BrowseForFolder»), после переноса и регистрации «safrcdlg.dll» работает и «SAFRCFileDlg.FileOpen». В крайнем случае, можно попробовать воспользоваться методом, описанным здесь (обратите особое внимание на постскриптум).

3

Re: VBS: диалоговое окно выбора файла в windows vista & 7

Я правильно понял, что лицензию на «MS Common Dialog Control» можно получить вполне легально и бесплатно, судя по:

Hi, Arno

MSComDlg.CommonDialog is indeed a licensed control, which Microsoft
distributes with Visual Studio and perhaps some other packages.  Microsoft
also gives you a free license with some of its free downloads, one of which
is a simple HTML editor.  Perhaps you can read the license agreement when
you install one of these free downloads and figure out a similar way for
your users to get the free license.  The first time you run the HTML editor
.HTA on a computer with no license for MSComDlg.CommonDialog, it installs
the license.  Perhaps your application can use the common dialog's other
functions, such as its color picker.

Ссылки см. в источнике. Кто-либо может опробовать данный вариант?

Правда, сам я пробовал «Simple HTML editor» непосредственно с установленной с диска MSDN (ничего не зная о вышеизложенном).

4

Re: VBS: диалоговое окно выбора файла в windows vista & 7

alexii пишет:

VBS. Вызов стандартного окна выбора файла в Windows Vista ?

Разумеется, через два часа предоставлю логи.

Вот пример из TechNet, только изменил OPTIONS = 16384 для файлов.

Const WINDOW_HANDLE = 0
Const OPTIONS = 16384
Set objShell = CreateObject("Shell.Application")
Set objFolder = objShell.BrowseForFolder _
    (WINDOW_HANDLE, "Select a folder:", OPTIONS, "C:\") 
If objFolder Is Nothing Then
    Wscript.Quit
End If
Set objFolderItem = objFolder.Self
objPath = objFolderItem.Path
Wscript.Echo objPath
alexii пишет:

Ссылки см. в источнике. Кто-либо может опробовать данный вариант?

Проверю, по результатам отпишусь.

5

Re: VBS: диалоговое окно выбора файла в windows vista & 7

Замечание, при использование хост-сервера (cscript, wscript): Ошибка выполнения Microsoft VBScript: Невозможно создание объекта контейнером ActiveX: 'MSComDlg.CommonDialog'
А ежели запустить в PrimalScript, VbsEdit выполняется успешно, все это мне напоминает кол-во сессий RDP в XP...

6

Re: VBS: диалоговое окно выбора файла в windows vista & 7

abasov, письмо от меня получили?

7

Re: VBS: диалоговое окно выбора файла в windows vista & 7

Да, спасибо, вот запустил.

HTML_Editor.hta (Windows 7):
стока 89
символ 2
Объект не поддерживает это свойство или метод.
var oDropDown = oToolBar.createDropDownListAt("4");

8 (изменено: abasov, 2009-12-10 20:08:15)

Re: VBS: диалоговое окно выбора файла в windows vista & 7

т.е. до этого даже не доходит
<!-- Create the licensing object for the common dialog activex control -->
<OBJECT CLASSID="clsid:5220cb21-c88d-11cf-b347-00aa00a28331">

Есть возможность проверить на двух одинаковых ОС 7, результат идентичен.

9

Re: VBS: диалоговое окно выбора файла в windows vista & 7

Ну, а если, гм, ручками добавить в реестр как здесь (смотрим постскриптум)?

Да, кстати, а может быть тут дело в пресловутом «запуск от имени администратора»? А то, может быть, mshta.exe пытается писать, а запись идёт в песочницу?!

10

Re: VBS: диалоговое окно выбора файла в windows vista & 7

alexii пишет:

Ну, а если, гм, ручками добавить в реестр как здесь (смотрим постскриптум)?

Конечно, регистрировал в реестре. Вопрос по всей видимости остается открытым.
Кстати, ошибка:

HTML_Editor.hta (Windows 7):
стока 89
символ 2
Объект не поддерживает это свойство или метод.
var oDropDown = oToolBar.createDropDownListAt("4");

Появляется как на 7-ке, так и на XP, возможно это связанно с установленными у вас компонентами Visual Studio?

11

Re: VBS: диалоговое окно выбора файла в windows vista & 7

Нет, Visual Studio отсутствует (ОС — XP). Для XP могу вечером проверить на гольной ОС — только с установленным SP3.

12

Re: VBS: диалоговое окно выбора файла в windows vista & 7

А может кто-нибудь подтвердить или опровергнуть неработоспособность примеров вызова dialogbox в Windows 7 (указывайте пожалуйста битность ОС)?

Примеры можно найти здесь.

13

Re: VBS: диалоговое окно выбора файла в windows vista & 7

Так, по:

Для XP могу вечером проверить на гольной ОС — только с установленным SP3.

абсолютно Ваша же ситуация. Насколько я понял, сие связано с тем, что кроме самого HTA нужны дополнительные файлы (кроме «html_editor.hta»). Сам на такое когда-то натыкался (да и забыл), из-за чего пришлось загружать пример с MS (который ныне доступен только как часть SDK:

LOCKMAN9 пишет:

The HTML Editor sample can still be found in the Microsoft Platform SDK for Windows Server 2003 R2 and in the default install location,the folder location is C:\Program Files\Microsoft Platform SDK for Windows Server 2003 R2\Samples\Web\ie6\htmleditor.

). Позже я его ненароком удалил .

Однако, взять россыпью содержимое примера «HTML Editor Application» всё ещё можно здесь (в принципе, «stepfour.hta», «stepthree_a.htm», «stepthree_b.htm» и «steptwo.htm» — не нужны). Кроме того, естественно, должен наличествовать и быть зарегистрирован сам «MS Common Dialog Control»:

regsvr32.exe comdlg32.ocx

(именно «comdlg32.ocx», а не «comdlg32.dll»!; в «гольной» ОС он отсутствует, может быть взят с машины, где он уже есть, либо — непосредственно отсюда [хоть это и старая версия библиотеки]). После всего этого «html_editor.hta» заработал. А вот:

CreateObject("MSCOMDLG.COMMONDIALOG")

по прежнему требовал лицензии . Вылечился уже дважды упомянутым методом из постскриптума.

Напоминаю, речь шла о «гольной» XP SP3.

14

Re: VBS: диалоговое окно выбора файла в windows vista & 7

Нашёл, где лежит пример в MSDN. Для 2005-го это будет файл:

%ProgramFiles%\MSDN\MSDN8.0\Language Neutral Files\webdev10\SCREDIT.hxs

представляющий собой chm-файл справки. Открыть/распаковать его можно, например, в 7zip. Нас интересует содержимое вложенной папки:

\workshop\samples\author\editing\html_editor
comdlg.lpk
dcheckforsave.htm
html_editor.hta
htmledlogo.gif
menu.htc
netpad.ico
stepfour.hta
stepthree_a.htm
stepthree_b.htm
steptwo.htm
toolbar.htc
ui_backcolor.gif
ui_bold.gif
ui_bulletlist.gif
ui_centeralign.gif
ui_fontcolor.gif
ui_form-copy.gif
ui_form-strike.gif
ui_indent.gif
ui_italic.gif
ui_leftalign.gif
ui_new.gif
ui_numberlist.gif
ui_open.gif
ui_outdent.gif
ui_paste.gif
ui_redo.gif
ui_rightalign.gif
ui_save.gif
ui_save_alert.gif
ui_subscript.gif
ui_superscript.gif
ui_tool-cut.gif
ui_tool_vertical.gif
ui_underline.gif
ui_undo.gif

Аналогично, имеется файл:

%ProgramFiles%\MSDN\MSDN8.0\Language Neutral Files\webdev10\progie.hxs

папка внутри chm:

\workshop\samples\author\editing\html_editor

содержимое полностью аналогично предыдущему.

OFF: Как я искал? «Far Manager» + плагин «7-Zip Alternative» .

15

Re: VBS: диалоговое окно выбора файла в windows vista & 7

abasov пишет:

А может кто-нибудь подтвердить или опровергнуть неработоспособность примеров вызова dialogbox в Windows 7 (указывайте пожалуйста битность ОС)?

Мой примерчик работает нормально (win7 32bit).
(Естественно, вначале comdlg32.ocx зарегистрировал в системе и лицензию в реестр добавил).

16

Re: VBS: диалоговое окно выбора файла в windows vista & 7

Попробуйте посмотреть здесь http://forum.script-coding.com/viewtopi … 542#p37542

Со слов ВАЖНАЯ фишка.

Может быть это тоже как-то поможет.

17

Re: VBS: диалоговое окно выбора файла в windows vista & 7

Как я понял, основные проблемы:
1. UserAccounts.CommonDialog или SAFRCFileDlg - работает только в XP.
2. MSComDlg.CommonDialog - нужна лицензия.
3. Использование Internet Explorer c полем "input type=file" вызывает не очень настраиваемое окно загрузки - и начиная с IE8 возвращается только имя файла, а вместо пути ерунда (для защищенности).

Предлагаю решение с запуском HTA и вызовом функции из него:

Option Explicit

' Если возвращает True, то strFileName содержит полное имя файла

Private Function OpenFileDlg(strFileName)
  Const SW_HIDE = 0
  Const CUniqueID = "UniqueID" ' Для распознования "своего" окна
  Const CSleepInterval = 100 ' Ожидаем запуска MSHTA.exe циклом в CSleepCount интервалов с засыпанием на CSleepInterval мсек
  Const CSleepCount = 100

  Dim objWshShell, objShell, objShellWindows, objIEItem, objHTA, iCount

  OpenFileDlg = False
  Set objWshShell = CreateObject("WScript.Shell")
  objWshShell.Run "%windir%\system32\MSHTA.EXE " & _
    """javascript:new ActiveXObject('InternetExplorer.Application').PutProperty('" & CUniqueID & "', window);""", SW_HIDE
  Set objWshShell = Nothing
  Set objShell = CreateObject("Shell.Application")
  Set objShellWindows = objShell.Windows
  Set objShell = Nothing
  iCount = 1
  Do Until iCount = CSleepCount
    For Each objIEItem In objShellWindows
      If IsObject(objIEItem.GetProperty(CUniqueID)) Then
        Set objHTA = objIEItem.GetProperty(CUniqueID)
        objIEItem.Quit
        Exit For
      End If
    Next
    WScript.Sleep CSleepInterval
    iCount = iCount + 1
  Loop
  Set objShellWindows = Nothing
  If IsObject(objHTA) Then
    objHTA.document.body.innerHTML = "<OBJECT ID=Dlg CLASSID=CLSID:3050f4e1-98b5-11cf-bb82-00aa00bdce0b></object>"
    strFileName = objHTA.Dlg.object.openfiledlg("", "", "Только текстовые(*.txt)|*.txt|Все(*.*)|*.*", "Выбрать файл")
    objHTA.close
    Set objHTA = Nothing
    OpenFileDlg = (strFileName <> "")
  End If
End Function

Dim strFileName

If OpenFileDlg(strFileName) Then
  WScript.Echo strFileName
End If

У меня XP, там это работает, но надеюсь должно и в Vista/XP.
Проверьте, кто может.

18

Re: VBS: диалоговое окно выбора файла в windows vista & 7

AnvarovSR пишет:

…но надеюсь должно и в Vista/XP.

Очевидно, подразумевалось — в «Vista/Windows 7».

AnvarovSR, если открыть список «Тип файлов» — после первых пунктов у меня идёт «каша».

19

Re: VBS: диалоговое окно выбора файла в windows vista & 7

Да, конечно Vista/7

openfiledlg("", "", "Только текстовые(*.txt)|*.txt|Все(*.*)|*.*", "Выбрать файл")

У меня мусора не было, но можно попробовать в виде "Только текстовые(*.txt)|*.txt|Все(*.*)|*.*" & vbNullChar
Да, и если это переменная, а не явная строка, то нужно приводить к типу с помощью CStr. Тоже для всех параметров.
Если нужно несколько расширений, то можно так: "Только текстовые(*.txt;*.lst)|*.txt;*.lst|Все(*.*)|*.*
Первый параметр может содержать начальный путь, но только вместе с именем файла. При этом от имени файла "откусывается" расширение по фильтру. Т.е. можно указать (в моем примере) "c:\......\*.txt" и перейдет в указанный каталог, а в строке останется *

20

Re: VBS: диалоговое окно выбора файла в windows vista & 7

Показываю, что есть:

Только текстовые(*.txt)    
Все(*.*)    
11cf-bb82-00aa00bdce0b></object>    
g?vascript:new ActiveXObject('InternetExplorer.Application').PutProperty('UniqueID', window);

При добавлении:

… & vbNullChar

ничего не изменилось. Windows XP SP3, IE 6.0.

21

Re: VBS: диалоговое окно выбора файла в windows vista & 7

Функция реализована в mshtmled.dll, у меня версии 8.00.6001.18702 (longhorn_ie8_rtm(wmbla).090308-0339), т.е. IE 8.0
Вот описание из интерфейса IHtmlDlgHelper2:
[id(8)] BSTR openfiledlg(
  [in] VARIANT initFile,
  [in, optional] VARIANT initDir,
  [in, optional] VARIANT filter,
  [in, optional] VARIANT title);
По логике, она должна вызывать API функию GetOpenFileName, у которой параметр Filter задается как набор пар строк, заканчивающихся нулями и в конце еще просто ноль. Если исходить из синтаксиса, то фунция подменяет символы "|" на нули и передает функции API. Так что можно попробовать добавить в конце символ "|":
"Только текстовые(*.txt)|*.txt|Все(*.*)|*.*|"

У меня Windows XP SP3, IE8. Но возможно просто везет, в том плане, что IE8 параноидально чистит память.