При попытке устанавливать программы (например, 1С) из каталога, содержащего русские буквы, установщик не находит свои файлы.
Предположительно это связано с проблемами с короткими именами. В установщике 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 создавать.
Тогда вопрос закрыт.