Bug 2465

Summary: Исправить explorer
Product: WINE@Etersoft Reporter: Денис Баранов <baraka>
Component: Консоль ; Вызов программAssignee: Виталий Перов <vitperov>
Status: CLOSED FIXED QA Contact:
Severity: minor    
Priority: P4 CC: ddv, lav
Version: 1.0.9   
Target Milestone: ---   
Hardware: PC   
OS: All   
Whiteboard:
Заявки RT: Связано с:
Дата напоминания:
Bug Depends on:    
Bug Blocks: 2088, 7398    

Description Денис Баранов 2008-09-17 22:07:11 MSD
В 1С81 можно открывать вложеные файлы (например *.doc).

> trace:process:CreateProcessW app (null) cmdline L"explorer
> C:\\windows\\temp\\123g.doc"
>
> Ну вот, значит они вместо запуска по
> расширению через ShellExec вызывают explorer с
> нужным файлом. Метод странный, надо
> сказать.

Нужно реализовать так чтобы вызов происходил через ShellExec.

Воспроизведение: Документы - Электронное письмо - Вложение - добавляем какой нить файл и нажимаем кнопку "Открыть".

Дополнительную информаию можно найти в баге 2088.
Comment 1 Виталий Перов 2008-09-19 12:07:47 MSD
Какая бутылка?
Замучился уже по бутылкам ходить. Так и не нашёл с 8.1 где есть меню "Документы".
В следующий раз, пожалуйста, указывай бутылку, чтобы лишнее время не траитить
Comment 2 Vitaly Lipatov 2008-09-19 12:39:07 MSD
Проверяй просто:
$ wine explorer документ.doc

и сравни с тем, что делает в этом случае
explorer документ.doc в винде

1С тут ни при чём.
Comment 3 Виталий Перов 2008-10-06 20:44:38 MSD
Проверил на win2k3
При вызове explorer filename появляется диалог открыть/сохранить файл.
При вызове explorer folder открывается директория.

Проверил на wine:
explorer без атрибутов - открывается обзор диска C:
explorer c любыми атрибутами - отктывается странный пустой каталог, откуда нельзя никуда перейти
Comment 4 Виталий Перов 2008-10-06 21:25:22 MSD
с помощью встроенной функции ParseCommandLine из коммандной строки парсятся параметры. 
Выходная структура:
ypedef struct parametersTAG {
    BOOL    explorer_mode;
    WCHAR   root[MAX_PATH];
    WCHAR   selection[MAX_PATH];
} parameters_struct;

При указании параметров:
explorer_mode = 0;
root=selection=первый параметр.

есть ещё командные ключи, которые должны парсится в ParseCommandLine
Например:
 * [/n]  Opens in single-paned view for each selected items. This is default
 * [/e,] Uses Windows Explorer View

но такое ощущение, что они не парсятся.
Comment 5 Виталий Перов 2008-10-07 16:08:49 MSD
Разобрался. Параметры парсятся.
Если не найдены все ключи, то вся строка параметров копируется в parameters->root
В этом случае должен открываться файл/директория, которыая указана в параметрах.

Если путь относительный,  отктывается странный пустой каталог, откуда нельзя
никуда перейти.
Если путь полный, то:
* При указании директории открывается эта директория
* При указании файла (если путь правильный), то открывается директория, но справа виден только файл, который был указан. Остальные файлы не видны.
Как я понял, такое поведение должно быть с ключом /select

Вообще заметил очень странную особенность:
Если указывать просто атрибуты, без ключей, то выполняется:
CopyPathString(parameters->root,p2);
но результат появляется не только в переменной parameters->root, но и в переменной parameters->selection

Comment 6 Виталий Перов 2008-10-07 17:40:30 MSD
Ничего не помнимаю:
Выполняю копирование функцией:
lstrcpyW(parameters->root,p2);
Но всё-равно результат появляется и в parameters->selection

Пробовал создавать parametrs динамически - ничего не изменилось.
Пробовал выводить адреса:
MODE = 0x32f9f4, ROOT = 0x32f9f8, Selection = 0x32fc00
Адреса - разные.

А проблема была в отображени информации. При вызове:
printf("MODE = %d, ROOT = %s, Selection = %s\n", parameters->explorer_mode, debugstr_w(parameters->root), debugstr_w(parameters->selection));

debugstr_w вызывается 2 раза. Притом сама функция объявлена как:
static const char *debugstr_w(LPCWSTR str)
{
   static char buf[1024];
   WideCharToMultiByte(CP_ACP, 0, str, -1, buf, sizeof(buf), NULL, NULL);
   return buf;
}

т.е буфер статический. И при повторном обращении предыдущее значение затирается.
Comment 7 Виталий Перов 2008-10-07 18:54:32 MSD
Сейчас explorer работает следующим образом:
Формируется коммандная строка winefile_commandline, состоящая из полного пути и названия winefile а также аргумента, который берётся из parameters.root
Дальше выполняется запуск данной комманды с помощью CreateProcess

полностью заменить CreateProcess на ShellExecute не удастся, т.к она нужна для запуска эксплорера.

Думаю, что надо сначала (при наличии параметров) запускать ShellExecute и смотреть на код возврата, если всё в порядке, то просто завершать программу. Если возникли какие-то проблемы, то запускать CreateProcess.
Так по крайней мере не изменится поведение программы при указании неправильных путей.
Comment 8 Виталий Перов 2008-10-07 19:54:52 MSD
Багу исправил.
Документы открываются.
Патч отправил
Comment 9 Денис Баранов 2008-10-08 16:36:03 MSD
Сборка вышла, порверил еще раз. Все ок.
Закрываю.