Столкнулся с проблемой создания ярлыка на рабочем столе

Я только что создал настраиваемый диалог с флажком, спрашивающим, хочет ли пользователь создать ярлык на рабочем столе. Раньше я всегда включал ярлык. Я не использую функцию 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) очень ограничены.


person Broots Waymb    schedule 06.06.2016    source источник
comment
Это немедленное или отложенное пользовательское действие? отложенные пользовательские действия не инициализируют переменную INSTALLDIR.   -  person yossiz74    schedule 07.06.2016
comment
@ yossiz74 yossiz74 - я изменил его на немедленное действие и поместил его после ExecuteAction, и, похоже, он работает.   -  person Broots Waymb    schedule 07.06.2016
comment
Отлично, тогда я добавлю это как ответ   -  person yossiz74    schedule 07.06.2016


Ответы (2)


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

person yossiz74    schedule 07.06.2016

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

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

person Michael Urman    schedule 07.06.2016