Пример кода (комбинация Andrew с дополнительным моим в what-is-the-purpose-of-interfaces), который также излагает доводы о почему интерфейс вместо абстрактного класса на языках без поддержки множественного наследования (c# и Java):
interface ILogger
{
void Log();
}
class FileLogger : ILogger
{
public void Log() { }
}
class DataBaseLogger : ILogger
{
public void Log() { }
}
public class MySpecialLogger : SpecialLoggerBase, ILogger
{
public void Log() { }
}
Уведомление, что FileLogger и DataBaseLogger не нужен интерфейс (мог быть абстрактный базовый класс Регистратора). Но полагайте, что Вы обязаны использовать сторонний регистратор, который вынуждает Вас использовать базовый класс (позволяет, говорят, что он представляет защищенные методы Вы Потребность использовать). Поскольку язык не поддерживает множественное наследование, Вы не будете в состоянии использовать подход абстрактного базового класса.
Нижняя строка: используйте интерфейс, если это возможно, для получения дополнительной гибкости на коде. Ваша реализация менее связывается, таким образом, она размещает лучше для изменения.
Любой вариант будет работать, но есть несколько моментов.
1) Вы потребуется либо {userdesktop}, либо {commondesktop}, в зависимости от того, был ли ярлык установлен для конкретного пользователя или для всех пользователей.
2) Вам необходимо обязательно добавить расширение .lnk к ярлыку имя.
Так что это, вероятно, сработает:
DeleteFile(ExpandConstant('{userdesktop}\Shortcut Name.lnk'));
DeleteFile(ExpandConstant('{commondesktop}\Shortcut Name.lnk'));
или
[InstallDelete]
Type: files; Name: "{userdesktop}\Shortcut Name.lnk"
Type: files; Name: "{commondesktop}\Shortcut Name.lnk"