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
Какая бутылка? Замучился уже по бутылкам ходить. Так и не нашёл с 8.1 где есть меню "Документы". В следующий раз, пожалуйста, указывай бутылку, чтобы лишнее время не траитить Проверяй просто: $ wine explorer документ.doc и сравни с тем, что делает в этом случае explorer документ.doc в винде 1С тут ни при чём. Проверил на win2k3 При вызове explorer filename появляется диалог открыть/сохранить файл. При вызове explorer folder открывается директория. Проверил на wine: explorer без атрибутов - открывается обзор диска C: explorer c любыми атрибутами - отктывается странный пустой каталог, откуда нельзя никуда перейти с помощью встроенной функции 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 но такое ощущение, что они не парсятся. Разобрался. Параметры парсятся. Если не найдены все ключи, то вся строка параметров копируется в parameters->root В этом случае должен открываться файл/директория, которыая указана в параметрах. Если путь относительный, отктывается странный пустой каталог, откуда нельзя никуда перейти. Если путь полный, то: * При указании директории открывается эта директория * При указании файла (если путь правильный), то открывается директория, но справа виден только файл, который был указан. Остальные файлы не видны. Как я понял, такое поведение должно быть с ключом /select Вообще заметил очень странную особенность: Если указывать просто атрибуты, без ключей, то выполняется: CopyPathString(parameters->root,p2); но результат появляется не только в переменной parameters->root, но и в переменной parameters->selection Ничего не помнимаю: Выполняю копирование функцией: 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; } т.е буфер статический. И при повторном обращении предыдущее значение затирается. Сейчас explorer работает следующим образом: Формируется коммандная строка winefile_commandline, состоящая из полного пути и названия winefile а также аргумента, который берётся из parameters.root Дальше выполняется запуск данной комманды с помощью CreateProcess полностью заменить CreateProcess на ShellExecute не удастся, т.к она нужна для запуска эксплорера. Думаю, что надо сначала (при наличии параметров) запускать ShellExecute и смотреть на код возврата, если всё в порядке, то просто завершать программу. Если возникли какие-то проблемы, то запускать CreateProcess. Так по крайней мере не изменится поведение программы при указании неправильных путей. Багу исправил. Документы открываются. Патч отправил Сборка вышла, порверил еще раз. Все ок. Закрываю. |