В 1С81 можно открывать вложеные файлы (например *.doc). > trace:process:CreateProcessW app (null) cmdline L"explorer > C:\\windows\\temp\\123g.doc" > > Ну вот, значит они вместо запуска по > расширению через ShellExec вызывают explorer с > нужным файлом. Метод странный, надо > сказать. Нужно реализовать так чтобы вызов происходил через ShellExec. Воспроизведение: Документы - Электронное письмо - Вложение - добавляем какой нить файл и нажимаем кнопку "Открыть". Дополнительную информаию можно найти в баге 2088.
Какая бутылка? Замучился уже по бутылкам ходить. Так и не нашёл с 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. Так по крайней мере не изменится поведение программы при указании неправильных путей.
Багу исправил. Документы открываются. Патч отправил
Сборка вышла, порверил еще раз. Все ок. Закрываю.