1

Тема: WSH: ShellFolderView.SelectItem в Win98 выдает ошибку

Здравствуйте! Помогите разобраться с непонятками.

Предыстория такая (это просто для полноты картины, к делу не относится).

Тут на форуме есть топик про скрипт для опции контекстного меню ярлыков в Проводнике (.LNK-файлы), чтобы переходить в папку, где лежит целевой файл ярлыка. Я долго пользовался этим скриптом, но недавно оказалось, что на Win98 он не работает. Я попросил автора адаптировать скрипт под Win98, но моя просьба не встретила отклика, поэтому мне пришлось взять дело в свои хилые ручонки.

Суть проблемы.

В Win98 метод ShellFolderView.SelectItem почему-то выдает "неопознанная ошибка", хотя на WinMe/XP работает нормально. При этом в MSDN сказано, что метод SelectItem поддерживается, начиная с Win98 (или Win95 + IE4), так что непонятно, почему оно не работает.

Пример

// Будем работать с файлом C:\TEST\DIR1\FILE.TXT
// (подразумевается, что этот файл на диске есть)

var Shell;
var ShellWindows;
var FolderView;
var pathToOpen;
var fileAsFoIT;

pathToOpen = "C:\\TEST\\DIR1";

Shell = WScript.CreateObject("Shell.Application");
ShellWindows = Shell.Windows();

// берем наш файл как объект FolderItem
fileAsFoIT = Shell.NameSpace(pathToOpen).ParseName("FILE.TXT");
Shell.Open(pathToOpen); // открываем нашу папку

// подождем 2 секунды (просто чтобы быть уверенным,
// что наша папка успела открыться)
WScript.Sleep(2000);

FolderView = ShellWindows.Item().Document;

// выделяем наш файл в только что открытой папке
//
// **************************************************
// в WinMe/XP это работает как надо -- выделяет файл,
// но в Win98 почему-то вылазит "неопознанная ошибка"
// **************************************************
//
FolderView.SelectItem(fileAsFoIT, 1|4|8|16);

2

Re: WSH: ShellFolderView.SelectItem в Win98 выдает ошибку

EgorS, увы, навряд ли кто будет ставить Windows 98 даже на виртуалку, чтобы проверить неработающий под данной ОС скрипт. Вы сам Windows Script Host под Windows 98 до версии 5.6 обновили?

3

Re: WSH: ShellFolderView.SelectItem в Win98 выдает ошибку

Да, стоит Script Host последней возможной для Win98 версии 5.6. Это Win98SE + Internet Explorer 6 (установка IE6 обновляет многие компоненты, в том числе и WSH).

А насчёт виртуалки с Win98, хм... а что, это такая невыполнимая задача?! Я же вот поставил, хотя я ни разу не программист и к компам вообще по работе никакого отношения не имею. У меня это заняло где-то минут 40...

4

Re: WSH: ShellFolderView.SelectItem в Win98 выдает ошибку

EgorS, вы полагаете, что в 2020 году кому-то интересно разбираться почему что-то глючит на win98????:o

5 (изменено: wisgest, 2020-06-05 01:49:48)

Re: WSH: ShellFolderView.SelectItem в Win98 выдает ошибку

Дело, как я понимаю, в версии не WSH, а, скорее, shell32.dll…

Возможно, в ранних версиях ShellFolderView.SelectItem() не воспринимает в качестве аргумента объект типа ShellFolderItem, а требует строку (то ли это должен быть полный путь к файлу, то ли только его имя).
Но со строкой это не будет работать с папками, не являющимися каталогами файловой системы.

P.S. Хотя, что-то я сомнительное написал. Вероятно что-то другое.

6

Re: WSH: ShellFolderView.SelectItem в Win98 выдает ошибку

wisgest пишет:

Возможно, в ранних версиях ShellFolderView.SelectItem() не воспринимает в качестве аргумента объект типа ShellFolderItem, а требует строку

Согласно MSDN метод SelectItem принимает объект типа FolderItem, про передачу в него строк там ничего не сказано.

Вы его (SelectItem), наверное, попутали с Shell.Open() и Shell.NameSpace(), про которые вы пишите тут

Оказывается, Shell.Open() и Shell.NameSpace() могут принимать в качестве аргумента не только строку (путь папки) или число, определяющее специальную папку, но и объекты Folder и FolderItem!

Между тем, все в тех же святых скрижалях MSDN :) в описании Shell.Open() допустимыми аргументами для него заявлены только: строка (путь к папке), либо значения констант специальных папок (в MS это называют ShellSpecialFolderConstants), про возможность передачи туда объектов типа Folder, FolderItem там ничего не сказано. В реальности это, правда, работает, но опять-таки — только на WinMe/XP, но не Win98. Я специально проверил там Shell.Open() (Shell.NameSpace() не проверял, неохота уже), так вот: при передаче в него папки как объекта FolderItem вылазит ошибка "папка перемещена или удалена", а при передаче папки как объекта Folder — просто ничего не происходит. В Win98 Shell.Open() работает только если передавать туда строку.

7

Re: WSH: ShellFolderView.SelectItem в Win98 выдает ошибку

EgorS пишет:

Вы его (SelectItem), наверное, попутали с Shell.Open() и Shell.NameSpace()

Так и есть, я это сам понял, но не стал удалять ответ, а добавил к нему postscriptum.