Summary: | Компас10: Неправильное значение в реестре при установке | ||
---|---|---|---|
Product: | [Поддержка проектов] КОМПАС 3D | Reporter: | Виталий Перов <vitperov> |
Component: | Тестирование | Assignee: | Andrey Vusik <night> |
Status: | CLOSED FIXED | QA Contact: | Денис Баранов <baraka> |
Severity: | minor | ||
Priority: | P2 | CC: | lav, mais, mx |
Version: | v10 | ||
Target Milestone: | --- | ||
Hardware: | PC | ||
OS: | Linux | ||
Whiteboard: | |||
Заявки RT: | Связано с: | ||
Дата напоминания: | 2011-02-10 | ||
Bug Depends on: | 5157 | ||
Bug Blocks: | 42, 753, 2482, 5101, 7073 |
Description
Виталий Перов
2008-09-23 20:40:20 MSD
Для записи в реестр пути к последнему источнику msi_publish_sourcelist вызывает функцию msi_set_last_used_source. Туда уже передаётся неправильное значение: C:\\Kompas3DV10_Demo\\Data1.cab Информация берётся из &package->sourcelist_info. А конкретно значение последнего пути находится в sourcelist_info->value Структуры MSISOURCELISTINFO в MSDN нету. Остаётся только догадываться где же всё-таки должно урезаться имя файла: в функции msi_set_last_used_source или уже в структуре MSISOURCELISTINFO путь не содержит имени файла package->sourcelist_info это список. Информация туда добавляется с помощью внутренней функции msi_package_add_info. А функция эта вызывается из msi_load_media_info (тоже внутренняя) Там source берётся из: source_dir = msi_dup_property(package, cszSourceDir); Получается, что уже здесь должна быть именно директория, а не путь к файлу Далее стек вызова функций выглядит следующим образом: msi_dup_property (внутр) MSI_GetPropertyW (внутр) MSI_GetPropertyRow (внутр) она формирует SQL запрос и вызывает: MSI_QueryGetRecord( package->db, query, name ) (внутр) далее, думаю копаться бесполезно. Очевидно, что в БД уже содержится неправильное значение Вставка значения в БД скорее всего выполняется в функции msi_set_sourcedir_props в качестве source_dir из БД запрашивается szOriginalDatabase Далеее оттуда урезается имя файла. В принципе всё должно работать правильно! Провоерил, в БД содержится всё-таки правильное значение: msi_load_media_info запрашивает директорию с помощью source_dir = msi_dup_property(package, cszSourceDir); и получает вполне нормальное значение Ошибка находится в: if (file->IsCompressed && mi->cabinet) { if (mi->cabinet[0] == '#') { r = writeout_cabinet_stream(package, &mi->cabinet[1], mi->source); if (r != ERROR_SUCCESS) { ERR("Failed to extract cabinet stream\n"); return ERROR_FUNCTION_FAILED; } } else lstrcatW(mi->source, mi->cabinet); } Не знаю должна ли переменная mi->source содержать ещё имя файла в этом случае. По всей видимости должна. Как это проверить в винде - не знаю. Здесь все функции внутренние. Думаю не стоит трогать mi->source, а брать запись непосредственно из БД. Внёс исправления. При обновлении уже существующей установки всё проходит нормально. При установке из чистой бутылки программа падает. это была моя ошибка. Неправильно выделял память. Исправил. Создал патч. Протестировал. Всё работает. В реестр записывается нужное значение Откатил патч: commit 7f67f75d4bb34fb9190aea45acb2edfbae48627f Author: Vitaly Perov <vitperov@etersoft.ru> Date: Sat Oct 24 15:57:40 2009 +0400 fix eterbug #2501: msi.dll: Fix writting incorrect value to the registry Думаю он уже не нужен. Необходимо проверить проявляется ли бага Важное замечание: сейчас изменение есть только в eterwine, нужно тестировать в eterwine или дождаться пока оно попадёт в eterhack. Изменение должно появится в eterhack 1.1.42 Откладываю до работ над 2.0. Проверил на WINE@Etersoft School 1.7.0 (который является текущим eterhack) путь содержится без имени файла, т.е. правильный. Закрываю. |