32-битный MSI: преобразование ярлыка целевого пути 64-битного приложения в 32-битный путь - PullRequest
1 голос
/ 18 июля 2010

Я работаю над проектом развертывания (на основе Wix), который используется для развертывания приложения для запуска с AutoCAD и создания ярлыков файла acad.exe в AutoCAD при передаче его собственного аргумента.

Для достижения этой цели существует dll Custom Action (C ++), которое перебирает разделы реестра Autocad, получает местоположение «acad.exe» и создает / обновляет ярлык, используя методы MSI Api в MyInstaller.msi во время выполнения. 1003 *

Проблема:

В 64-битных ОС, таких как Windows 7, настраиваемое действие считывает правильное расположение файла acad.exe из реестра, то есть C: \ Program Files \ AutoCAD 2010 \ acad.exe, и обновляет свойства ярлыка в msi во время выполнения. Но когда msi завершает создание ярлыка, путь преобразуется в 32-битные программные файлы, то есть C: \ Program Files (x86) \ AutoCAD 2010 \ acad.exe, которого на самом деле не существует.

Моя работа вокруг:

Поскольку мой msi 32-битный (x86), поэтому я создал отдельный компонент с атрибутом Win64 = Yes и изменил Custom Action для обновления / создания ярлыков для этого компонента. Но все же целевой путь в ярлыках преобразуется в C: \ Program Files (x86).

Я знаю, если я преобразую свой MSI для x64 OS, это может быть решено, но в настоящее время я не могу сделать такое большое изменение.

Есть ли способ, как 32-битный MSI может создавать ярлыки, содержащие пути ОС x64?

Любая помощь будет очень признательна ..

Большое спасибо.

Ответы [ 2 ]

1 голос
/ 18 июля 2010

На этом вы плывёте против MSI.(Хотя я могу понять почему.)

Официально MSI никогда не является платформой.Я предполагаю, что вы используете настраиваемое действие для чтения значений реестра, потому что AppSearch / Reglocator от MSI ограничит вас узлом WoWSys64.После этого MSI заменит даже жестко запрограммированные ссылки на программные файлы как часть подхода к совместимости приложений (в основном Microsoft предполагает, что вы не знали, что вы делаете, и что они знают, что вы действительно хотели сделать).

Неофициально - прочитайте эту ветку, чтобы найти взлом, который я решил обойти.В итоге я обнаружил, что если вы конвертируете C: \ Program Files \ в короткий путь (C: \ Progra ~ 1), то MSI недостаточно умен, чтобы понять, на что вы ссылаетесь, чтобы он не подставил значение.

http://www.joyofsetup.com/2010/03/27/wix-msbuild-v2-0-and-x64-systems/

Обратите внимание, что это взлом, и нет способа сказать, исправит ли Microsoft это в будущих выпусках.Единственный другой подход, о котором я могу подумать, это то, что вы затем не используете таблицу ярлыков и вместо этого пишете пользовательские действия для создания ярлыков для вас.

Если вы не хотите использовать MSI, попробуйте этот обходной путь.Создайте небольшой 64-битный EXE-файл (да, вы можете развернуть 64-битный или AnyCPU exe-файл в Program Files x86 - это MSI-файл x86), который выступает в качестве внешнего интерфейса для AutoCAD.Сделайте запрос к таблице реестра и найдите файл, затем запустите его или отобразите сообщение о том, что AutoCAD недоступен, если его не удается найти.

Если вы сделаете это, ваша установка станет намного чище.

0 голосов
/ 20 июля 2010

Хорошо, я смог ее решить:

Проблема была , 32-битный MSI на 64-битной ОС, преобразовывал пути (в таблице ярлыков) в 32-битные эквивалентные пути, т.е.получить путь AutoCAD из 64-битного ключа реестра как C: \ Program Files \ AutoCAD 2010 \, а затем внедрить этот путь в таблицу ярлыков MSI и таблицу каталогов.Но когда MSI писал ярлык, он конвертировал его в C: \ Program Files (x86) \ AutoCAD 2010.

У нас не может быть 64-битных компонентов в 32-битном MSI , но наоборотВозможна версия, т. Е. У нас может быть 32-битные компоненты в 64-битной MSI.

Однако в моем случае мне придется использовать 64-битные компоненты для ярлыков, а другие компоненты останутся 32-битными.Я преобразовал свой 32-битный MSI в 64-битный MSI, добавив Plantform = x64 в информацию о пакете.И объявить компонент как Win64 = Да.

И это решило мою проблему, и теперь я получаю правильные пути в ярлыках.

Благодаря этому теперь у меня есть 2 отдельных установщикат.е. для каждого 32-битного и 64-битного соответственно.

С наилучшими пожеланиями

Фаррух

...