Не устанавливается сервиспак на КОМПАС-3D V10. Пробегает индикатор прогресса распаковки после чего процесс прекращается. Сервиспак можно скачать по адресу http://download.kompas.kolomna.ru/public/Kompas-3D_V10/SP1/KOMPAS-3D_V10_SP1.zip
При извлечении файлов возникает ошибка. err:msi:ready_media Cabinet not found: L"C:\\windows\\Installer\\Data1.cab" Data1.cab в C:\\windows\\Installer нет, зато там есть *.msi (имя при каждой установке разное), оставшейся от установки Компаса. Если его удалить, при обновлении даже не показывается диалог установки. Получается, что запускается именно этот *.msi Только вот не понятно откуда берётся Data1.cab По идее он должен распаковываться из KOMPAS-3D_V10_SP1.EXE, но этого явно не происходит. сразу при запуске в консоле: fixme:advapi:DecryptFileA "C:\\windows\\temp\\IXP000.TMP\\" 00000000 сейчас вместо этой функции заглушка. По описанию, она должна дешифровывать зашифрованный файл. Притом шифрование, если я правильно понял, осуществляется на уровне файловой системы (The Encrypted File System, or EFS, was introduced in NTFS 5.0) При завершении программы C:\\windows\\temp\\IXP000.TMP удаляется. Но перед удалением можно посмотреть, что это пустая папка.
проваливается внутренняя функция find_published_source Сначала она вызывает MsiSourceListGetInfoW. Она возвращает корректный путь к исходному файлу установки C:\\Kompas3DV10_Demo\\Data1.cab далее в цикле вызывается MsiSourceListEnumMediaDisks, которая должна получать список дисков, зарегистрированных как источники для данного продукта. Цикл выполняется только 1 раз, и сравнение пути к исходному файлу с путём, полученным из MsiSourceListEnumMediaDisks. Сравнение производится функцией source_matches_volume, котороя проваливается с сообщением: err:msi:source_matches_volume Failed to get volume information
внутри GetVolumeInformationW используется функция GetDriveTypeW для получения типа устройства. Как-раз она и проваливается. По MSDN в качестве входного параметра туда передаётся строка, в которой указан корень диска. Сейчас туда передаётся полный путь вместе с именем файла. Надо написать тест и проверить как виндовая функция воспринимает полный путь
Создал тест, проверил на винде. На винде тоже не работает. Но, если отбрасывать имя файла, и оставлять только имя директории, то функция завершается успешно.
написал тест на GetVolumeInformation. Функция тоже не работает, когда в качестве входного параметра указывается файл, а не директория. Думаю, надо во внутренней функции source_matches_volume определять содержит ли путь название файла, и если содержит, то удалять его.
Реализовал удаление из пути имени файла. Не помогло Попробовал запустить тест, передающий GetDriveType путь к текущей директории: Локально результат верный = 3. В бутылке завершается с ошибкой во всех директориях диска с:
Как-то странно: GetDriveType выполняется успешно, но когда она вызывается из GetVolumeInformation, то она проваливается. Ещё GetVolumeInformation по-разному работает на локальном диске, и из бутылки. Разница в том, что в бутылке диск С это папка, а локально - это диск Z, который уже ссылка. Когда тест запускается локально, GetVolumeInformation идёт по другому пути CreateFileW( device .... открывается успешно, и GetDriveType не вызывается В том и в другом случае GetVolumeInformation не может получить имя диска. Думаю в данном случае нужно получать имя вручную, не вызывая GetVolumeInformation.
Возникла проблема: нужна именно метка диска, а не его корневая директория MsiSourceListEnumMediaDisks возвращает метку DISK1. Поэтому вручную из пути получить такую метку невозможно Есть ещё проблема: Сейчас в wine метки нет, поэтому должна возвращаться пустая строка, но никак не DISK1. (Проверял в винде: если метки нет, то возвращается пустая строка) Поэтому исправление GetVolumeInformation проблему не решит. Думаю придётся делать хак на find_published_source. Вряд ли источник установки может находится сразу на нескольких дисках, поэтому можно не выполнять принадлежность источника установки к дискам.
Обнаружил ещё проблему: Имя файла получается путём прибавления к строке mi->source строки mi->cabinet. Сейчас mi->source содержит путь вместе с именем файла. В результате получается: C:\Kompas3DV10_Demo\Data1.cabData1.cab Очевидно, строка mi->source должна содержать только путь к файлу. Строку эту возвращает функция MsiSourceListGetInfo, а берёт она её из реестра. Либо в реестре записано неправильное значение, либо сама функция должна из пути извлекать директорию. В принципе, можно написать хак, убрав строку lstrcatW(mi->source, mi->cabinet); Т.е брать путь к файлу только из mi->source. Но я думаю лучше всё проверить и нормально исправить ошибки
Т.к бага срочная, написал временный хак. Отправил в рассылку.
путь к источнику находится в HKEY_LOCAL_MACHINE\Software\Classes\Installer\Products\F1E4273BF20F3D9449BD8C51932AD7F9\SourceList. В wine он включает в себя и имя файла. Проверил в винде: там путь не включает имя файла. Получается, это ошибка при установке Компаса
Проверил в windows, по ключу HKEY_LOCAL_MACHINE\SOFTWARE\Classes\Installer\Products\F1E4273BF20F3D9449BD8C51932AD7F9\SourceList\Media значение 1=DISK1;1 Получается, что DISK1 это не метка диска, с которого производилась установка (метка была SYSTEM). Значит работает неправильно или функция MsiSourceListEnumMediaDisks или функция find_published_source
Необходимо исправить временный патч с учётом закрытия ошибки 2501. Сейчас он должен работать неправильно.
Исправил временный патч
Проверил на винде работу функции MsiSourceListEnumMediaDisks - там она тоже выдаёт метку диска VolumeLabel = "DISK1", хотя метка диска на той машине "SYSTEM" Получается, что "DISK1" это не метка диска, и врядли из "DISK1" можно получить метку диска. Поэтому искать последний источник во всех источниках надо по другому параметру
Вообще, в реестре для последнего источника содержится и номер источника: LastUsedSource = n;3;C:\windows\Installer\ Но при вызове MsiSourceListGetInfo (с атрибутом INSTALLPROPERTY_LASTUSEDSOURCEW) можно получить только путь. Стандартными WINAPI функциями номер источника никак не получить. Остаётся только писать внутреннюю функцию (переписать MsiSourceListGetInfo), которая бы это делала
Написал вспомогательную функцию. Переделал find_published_source. Проверил: работает. Отправил патч в рассылку.
WINE@Etersoft cad eter2.1/eter2 Ошибка снова воспроизводится. Лог получается такой: fixme:advapi:DecryptFileA "C:\\windows\\temp\\IXP001.TMP\\" 00000000 fixme:msi:MsiSourceListGetInfoW Unhandled context 4 fixme:msi:MsiSourceListGetInfoW Unhandled context 4 err:msidb:msi_table_load_transform insert row failed err:msidb:msi_table_load_transform insert row failed err:msidb:msi_table_load_transform insert row failed err:msidb:msi_table_load_transform insert row failed err:msidb:msi_table_load_transform insert row failed err:msidb:msi_table_load_transform insert row failed err:msidb:msi_table_load_transform insert row failed err:ole:CoGetClassObject class {6c736db1-bd94-11d0-8a23-00aa00b58e10} not registered err:ole:CoGetClassObject no class object {6c736db1-bd94-11d0-8a23-00aa00b58e10} could be created for context 0x1 err:ole:CoGetClassObject class {6c736db1-bd94-11d0-8a23-00aa00b58e10} not registered err:ole:CoGetClassObject no class object {6c736db1-bd94-11d0-8a23-00aa00b58e10} could be created for context 0x1 err:msi:ITERATE_Actions Execution halted, action L"ISQuickPatchInit" returned 1627 err:msi:ITERATE_Actions Execution halted, action L"ExecuteAction" returned 1627 err:msi:remove_tracked_tempfiles failed to delete L"C:\\windows\\temp\\msi9e94.tmp"
/var/ftp/pvt/Windows/CAD - 3D/Kompas/KOMPAS-3D_V10_SP1.EXE успешно устанавливается на полную установку Компаса в CAD 1.1.0-eter2.1/2 Но при запуске Компаса появляются ошибки 'C:\Program Files\ASCON\KOMPAS-3D V10\Libs\Materials\MaterialK6.DLL (error 126)' и 'Ошибка подключения библиотеки "C:\...\Libs\Materials\MaterialK6.DLL"'
(In reply to comment #19) > /var/ftp/pvt/Windows/CAD - 3D/Kompas/KOMPAS-3D_V10_SP1.EXE успешно > устанавливается на полную установку > Компаса в CAD 1.1.0-eter2.1/2 > Но при запуске Компаса появляются ошибки > 'C:\Program Files\ASCON\KOMPAS-3D V10\Libs\Materials\MaterialK6.DLL (error > 126)' и 'Ошибка подключения библиотеки > "C:\...\Libs\Materials\MaterialK6.DLL"' Что за ошибка с номером 126? Быть может какой-то лимит? Наверное надо установить на Windows, появится ли там этот файл?
Справка: MaterialK6.DLL - библиотека интеграции КОМПАС с библиотекой (справочником) Материалы и Сортаменты ...Libs\Materials\Materials.exe. Работают через COM. Сам Materials.exe работает с базой MatSort.MDB через ADO. ошибка 126 обычно вызывается тем, что: 1. Не хватает (недоустановились) какие-то библиотеки (dll) 2. Требуемые библиотеки не той версии (грубо говоря, не подходят). Т.е. при установке СП либо исходного продукта часть файлов могла недоустановится или не обновится.
Created attachment 1275 [details] Ошибка при запуске Компаса после winetricks vcrun2005
Проблема с загрузкой DLL связана с отсутствием в WINE библиотек MFC80U.DLL и MSVCR80.DLL: $ winedump -x MaterialK6.DLL | grep '^ offset.*[lL]$' offset 0003067c kAPI2D5.DLL offset 00030690 MFC80U.DLL offset 000306a4 MSVCR80.dll offset 000306b8 KERNEL32.dll offset 000306cc USER32.dll offset 000306e0 GDI32.dll offset 000306f4 ADVAPI32.dll offset 00030708 ole32.dll offset 0003071c OLEAUT32.dll После winetricks vcrun2005 при запуске Компаса появляется новое сообщение об ошибке (см. аттач выше).
От сообщений об ошибках можно избавиться, выполнив winetricks vcrun2005 winetricks vcrun2005sp1 До установки библиотек: fixme:actctx:parse_depend_manifests Could not find dependent assembly L"Microsoft.VC80.CRT" (8.0.50727.762) err:module:import_dll Library MFC80U.DLL (which is needed by L"C:\\Program Files\\ASCON\\KOMPAS-3D V10\\Libs\\Materials\\MaterialK6.DLL") not found err:module:import_dll Library MSVCR80.dll (which is needed by L"C:\\Program Files\\ASCON\\KOMPAS-3D V10\\Libs\\Materials\\MaterialK6.DLL") not found После winetricks vcrun2005: fixme:actctx:parse_depend_manifests Could not find dependent assembly L"Microsoft.VC80.CRT" (8.0.50727.762) trace:loaddll:load_native_dll Loaded L"C:\\windows\\system32\\MSVCR80.dll" at 0x78130000: native trace:loaddll:load_native_dll Loaded L"C:\\windows\\system32\\MFC80U.DLL" at 0x782e0000: native trace:loaddll:load_native_dll Loaded L"C:\\Program Files\\ASCON\\KOMPAS-3D V10\\Libs\\Materials\\MaterialK6.DLL" at 0xe760000: native После winetricks vcrun2005sp1: trace:loaddll:load_native_dll Loaded L"C:\\windows\\winsxs\\x86_Microsoft.VC80.CRT_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_6b128700\\MSVCR80.dll" at 0x78130000: native trace:loaddll:load_native_dll Loaded L"C:\\windows\\winsxs\\x86_Microsoft.VC80.MFC_1fc8b3b9a1e18e3b_8.0.50727.762_x-ww_3bf8fa05\\MFC80U.DLL" at 0x782e0000: native trace:loaddll:load_native_dll Loaded L"C:\\Program Files\\ASCON\\KOMPAS-3D V10\\Libs\\Materials\\MaterialK6.DLL" at 0xe540000: native
Раз уж ты не стал проверять установку только с vcrun2005sp1, проверь пожалуйста сборку 1.1.0-eter4 (пакеты установлены на kompas, или в /var/ftp/pub/download/WINE@Etersoft-CAD), я туда включил vcrun2005sp1
В 1.1.0-eter4 проблема осталась: fixme:actctx:parse_depend_manifests Could not find dependent assembly L"Microsoft.VC80.CRT" (8.0.50727.762) trace:loaddll:load_native_dll Loaded L"C:\\windows\\system32\\MSVCR80.dll" at 0x78130000: native trace:loaddll:load_native_dll Loaded L"C:\\windows\\system32\\MFC80U.DLL" at 0x782e0000: native trace:loaddll:load_native_dll Loaded L"C:\\Program Files\\ASCON\\KOMPAS-3D V10\\Libs\\Materials\\MaterialK6.DLL" at 0xe6b0000: native Появляются окошки с сообщениями об ошибках.
При установке SP1 почему-то удаляется часть файлов из c:/windows/winsxs, созданных при установке vcrun2005 и vcrun2005sp1.
Действие SxsUninstallCA, удаляющее часть файлов из c:/windows/winsxs, выполняется, если истинно условие "((Installed AND NOT REINSTALL) OR MsiPatchRemovalList) AND (NOT Version9X)". Installed в этом условии оказывается равно "1", а REINSTALL оказывается не установлено. Первоначально REINSTALL устанавливается в "ALL", но затем некое действие его зачем-то сбрасывает. Если подправить MSI_SetPropertyW так, чтобы REINSTALL не сбрасывался, то файлы не удаляются. Фрагмент лога со сбросом REINSTALL: trace:msi:MSI_ProcessMessage 4000000 trace:msi:MSI_ProcessMessage ((nil) 0 10 L"The QUICKPATCH_REINSTALL property is empty. Potentially, nothing is going to get installed.") trace:msi:MsiCloseHandle 7 trace:msi:MsiCloseHandle handle 7 destroyed trace:msi:msiobj_release object 0x10ba8f0 destroyed trace:msi:alloc_msihandle 0x10ba8f0 -> 7 trace:msi:MSI_ProcessMessage 4000000 trace:msi:MSI_ProcessMessage ((nil) 0 10 L"Setting REINSTALL to NULL") trace:msi:MsiCloseHandle 7 trace:msi:MsiCloseHandle handle 7 destroyed trace:msi:msiobj_release object 0x10ba8f0 destroyed trace:msi:MSI_SetPropertyW 0x12e998 L"REINSTALL" L""
В логе установки под Windows REINSTALL тоже устанавливается в NULL, и действие SxsUninstallCA выполняется.
Если vcrun2005sp1 устанавливать второй раз, то происходит удаление файлов из c:/windows/winsxs. При этом в логах, как и при установке SP1, присутствует вызов функции CustomAction_SxsMsmCleanup. Похоже, что в SP1 входит та же DLL, что и в установщик vcrun2005sp1.
> Если vcrun2005sp1 устанавливать второй раз, то > происходит удаление файлов из c:/windows/winsxs. В Wine 1.1.29 проблема не воспроизводится.
В Wine 1.1.25, на котором основан etercad, проблема есть.
2 lav: Будем ли мы мерджить оригинальный wine в etercad? Или просто возьмём из оригинального wine определённые нужные нам патчи?
Надо протестировать на текущем eterhack. Возможно, проблемы уже давно нет.
(В ответ на comment #34) > Надо протестировать на текущем eterhack. Возможно, проблемы уже давно нет. В текущем eterhack устанавливается корректно.
Закрываем раз работает.