Summary: | Не устанавливаются программы из каталогов с русскими буквами в пути | ||
---|---|---|---|
Product: | WINE@Etersoft | Reporter: | Vitaly Lipatov <lav> |
Component: | Общее | Assignee: | Роман Дадьков <cunning> |
Status: | CLOSED WONTFIX | QA Contact: | Денис Баранов <baraka> |
Severity: | normal | ||
Priority: | P2 | CC: | amorozov, baraka |
Version: | unspecified | ||
Target Milestone: | --- | ||
Hardware: | PC | ||
OS: | Linux | ||
Whiteboard: | |||
Заявки RT: | Связано с: | ||
Дата напоминания: | |||
Bug Depends on: | |||
Bug Blocks: | 42, 234, 6715 |
Description
Vitaly Lipatov
2006-04-22 17:53:58 MSD
Предположительно это связано с проблемами с короткими именами. В установщике 1С используется 16-битный код, который оперирует только короткими именами файлов. Очевидно, они неверно кодируются и каталог, названный по-русски, не может может быть найден установщиком. Перевожу в assigned. Результаты теста: устанавливал FineReader 7.0 из каталого с названием "Тест" - всё поставилось корректно. Что-то не так делаю? Ставил 1С и конфигурацию из : /home/vostok/wine_c/Program Files/Тестовый каталог Всё поставилось, как с моим Вайн так и с Вайн сервера. База ставилась в папку с русским названием. Изголялся как мог. Считаю, что бага в той формулировке, что обозначена не существует. Прошу доказать обратное. Суммарно было произведено 5 установок из каталога с русским названием. Синтезировал багу, надо чтобы каталог начинался с буквы "К" (как минимум) - допустим Космос. Похоже это глобальная проблема в вайн, требуется детальное изучение. В cmd те же проблемы (имена файлов выдаются в непонятной кодировке). 1с не хочет ставиться т.к. установщику её важно правильное имя каталога, другие программы работаю,т.к. не обращают на это внимание. Временное решение: Назвать каталог длинным именем (Типа не "Космос", а "КосмосКосмос") - всё работает. Смотреть read_directory_stat и NtQueryDirectoryFile. Нынешнее предположение - что для длинных имён используется перекодировка в оем с нормальной кодировкой, а короткие не перекадируются. Установщик 1с использует 16 битные функции. На 19.06.07 стало известно, что такие функции категорически не работаю в wine начиная с 37 версии. Отложено пока не починим/починят. *** Bug 6713 has been marked as a duplicate of this bug. *** Итак, проблема ещё с нами: http://bugs.etersoft.ru/show_bug.cgi?id=6713#c0 Источник проблемы: при коротком русском имени в пути (название каталога <=8 символов) всё нормально, но если имя длинное, то для 16-битных функций оно сокращается (как досовское) до вида «Русское имя» -> «РУССК~24» или как-то так. В функциях преобразования есть неуловленная до сих пор ошибка. Нужно: - написать программу с использованием 16-битных функций и коротких имён, воспроизводящую проблему. - исправить существующие тесты на файлы, чтобы они отражали проблему. - добиться принятия нашего патча в winehq, чтобы проблему закрыть навсегда. А где-нибудь можно посмотреть список 16-битных функций? и почему нельзя обычными написать? после функции RtlGetFullPathName_U возникает предупреждение о некорректном преобразовании, правда пока не понятно, то ли это преобразование из-за которого проблема возникает. есть какой-нибудь способ определить в каком файле описана функция RtlGetFullPathName_U ? > есть какой-нибудь способ определить в каком файле описана функция
> RtlGetFullPathName_U ?
Можно с помощью Ctrl+1 в kscope
написал, функцию, которая ошибку воспроизводит, winedebug сделал, видимо преобразование идет в функциях read_directory_stat и append_entry. Преобразование длинного имени в короткое происходит в функции *append_entry при помощи short_len = hash_short_file_name( &str, short_nameW ); в ней используется функция is_invalid_dos_char, которая проверяет допустимость символов. В этой функции допустимыми считаются только латинские символы. так было: static inline BOOL is_invalid_dos_char( WCHAR ch ) { static const WCHAR invalid_chars[] = { INVALID_DOS_CHARS,'~','.',0 }; if (ch > 0x7f) [#= сюда добавить =#] return TRUE; return strchrW( invalid_chars, ch ) != NULL; } так стало: static inline BOOL is_invalid_dos_char( WCHAR ch ) { static const WCHAR invalid_chars[] = { INVALID_DOS_CHARS,'~','.',0 }; if (ch > 0x7f) if((ch < 0x0400) || (ch > 0x04ff)) return TRUE; return strchrW( invalid_chars, ch ) != NULL; } (В ответ на comment #15) > Преобразование длинного имени в короткое происходит в функции *append_entry при > помощи > short_len = hash_short_file_name( &str, short_nameW ); ... > так было: ... > так стало: Что ты хотел сказать этим? Возможно, это изменение устраняет проблему? Ну и проверку с 7f, видимо, стоит стоит заменить на проверку через WideCharToMultiByte в кодировку CP_OEMCP есть мнение, что в версии 1.0.12 проблема не присутствует 1с лежал в папке с вайном просто с разными именами, разные версии вайна реагировали одинаково WINE@Etersoft version 1.3.9-eter1.6 ./wine 1C\:Хронограф\ Школа\ 2.5/1CV77/DISK1/setup.exe - не запускается ./wine длинное\ русское\ имя/1CV77/DISK1/setup.exe - устанавливается WINE@Etersoft version 1.3.10-eter2.11 ./wine 1C\:Хронограф\ Школа\ 2.5/1CV77/DISK1/setup.exe - не запускается ./wine длинное\ русское\ имя/1CV77/DISK1/setup.exe - устанавливается видимо проблемы как таковой с длинными русскими именами нет, а есть проблема с двоеточием в имени, причем его использовать, по-видимому можно, но не на всех позициях. проблемы не возникает (В ответ на comment #19) > видимо проблемы как таковой с длинными русскими именами нет, а есть проблема с > двоеточием в имени, причем его использовать, по-видимому можно, но не на всех > позициях. Багу по поводу двоеточия завели? Нужно здесь указать номер. нет, багу не завели. потому что в windows нельзя использовать двоеточие в именах файлов, тогда зачем эту проблему в wine создавать. Тогда вопрос закрыт. |