2016-06-06 3 views
1

Я только что создал пользовательский диалог с флажком, спрашивающим, хочет ли пользователь создать ярлык на рабочем столе. Я всегда использовал ярлык. Я не использую функцию AskText(), так как планирую добавить еще несколько частей на эту страницу позже и хочу упростить эти несколько параметров на этой странице.Выполнение задачи создания ярлыка на рабочем столе

Я получаю элемент на своем рабочем столе, когда я бегу, но это не то, что я ожидаю. Цель, похоже, указывает на местоположение на самом рабочем столе, а не на фактический исполняемый файл. Кроме того, этот ярлык не удаляется при удалении (я предполагаю, что это нужно обрабатывать отдельно в любом случае), а ярлык требует прав администратора для ручного удаления (чего я не хочу по очевидным причинам).

Ниже приведен мой код InstallScript. Он находится в пользовательском действии, которое было вставлено после InstallFiles.

function MyFunction(hMSI) 

    STRING szProgramFolder, szItemName, szCommandLine, szWorkingDir; 
    STRING szShortCutKey, szProgram, szParam, szIconPath; 
    NUMBER nIcon, nResult; 

begin 
    szProgramFolder = FOLDER_DESKTOP; 
    szItemName = "myProgram"; 

    szProgram = INSTALLDIR + "myProgram.exe" ; 
    LongPathToQuote (szProgram, TRUE); 
    szCommandLine = szProgram; 

    szWorkingDir = INSTALLDIR; 
    szIconPath = ""; 
    nIcon = 0; 
    szShortCutKey = ""; 

    nResult = AddFolderIcon (szProgramFolder, szItemName, szCommandLine,szWorkingDir, 
     szIconPath, nIcon, szShortCutKey, REPLACE); 

end; 

Я не совсем уверен, куда я иду неправильно здесь, хотя мое знание InstallShield (не говоря уже о InstallScript) является очень ограничено.

+0

Это немедленное или отложенное пользовательское действие? отложенные пользовательские действия не инициализируют переменную INSTALLDIR. – yossiz74

+0

@ yossiz74 - Я изменил его на немедленное действие, которое разместило его после ExecuteAction, и оно в значительной степени похоже работает. –

+0

Отлично, я добавлю его в качестве ответа тогда – yossiz74

ответ

1

Как оказалось, это отложенное настраиваемое действие, поэтому переменная INSTALLDIR не инициализирована (ни какие-либо другие встроенные переменные Windows Installer). Измените его на индивидуальное действие немедленного типа (и переместите его в соответствующее место в последовательности выполнения), и он должен работать.

0

Чтобы исправить параметры ярлыка, начните с обеспечения их правильности. Отлаживайте свою функцию, чтобы убедиться, что вы действительно передаете то, что хотите. Как отмечалось, INSTALLDIR может быть недоступен непосредственно для пользовательского действия InstallScript. Простым способом «отладки» было бы добавить такие вызовы, как MessageBox(szCommandLine, 0);, к ключевым моментам вашего кода. Если вы обнаружите, что передаете что-то вроде C:\Program Files\Company\ProductmyProgram.exe, подумайте об использовании оператора ^, чтобы объединить ваши пути: szProgram = INSTALLDIR^"myProgram.exe";.

Чтобы удалить ярлык, вы должны понимать, что пользовательские действия в проектах MSI не меняются автоматически. Поэтому используйте другой подход. Либо явным образом код его удаления во время удаления в другом действии, переключиться на чистый InstallScript, где ведение журнала будет отменять ваши действия, или идти с надлежащим MSI-подход. Для последнего из них определите ярлык в своем собственном компоненте и дайте компоненту условие, которое коррелирует с свойством, которое вы установили в своем пользовательском интерфейсе (или через AskText для сейчас), или пропустите условие и просто используйте выбор функции, поставив компонент в дочерней функции. Затем установщик Windows будет отслеживать и удалять ярлык для вас.

Смежные вопросы