Inno Setup обновить рабочий стол

#windows #inno-setup #pascalscript

#Windows #inno-setup #pascalscript

Вопрос:

Возможно ли обновить рабочий стол с помощью Inno Setup в [Code] разделе?

Либо с помощью SendMessage , либо как-то использовать SHChangeNotify ?

Ответ №1:

Вы можете вызвать любую функцию в Windows API, вызвав ее в соответствующей библиотеке DLL. Синтаксис библиотеки DLL Pascal задокументирован здесь. Документация по SHChangeNotify функции, как обычно, находится в MSDN. Эта функция найдена в Shell32.dll (неудивительно!).

 [Code]
const
  SHCNE_ASSOCCHANGED = $08000000;
  SHCNF_IDLIST = $00000000;

procedure SHChangeNotify(wEventID: integer; uFlags: cardinal; dwItem1, dwItem2: cardinal);
external 'SHChangeNotify@shell32.dll stdcall';

procedure SendChangeNotification;
begin
  SHChangeNotify(SHCNE_ASSOCCHANGED, SHCNF_IDLIST, 0, 0);
end;
  

Теперь вы можете вызывать SendChangeNotification что угодно, например, из функции событий.

Обновить

Приведенный выше текст отвечает на ваш вопрос, как «обновить рабочий стол с помощью Inno Setup в [Code] разделе». Но знаете ли вы, что Inno Setup может автоматически обновлять рабочий стол для вас? Просто напишите

 ChangesAssociations=yes
  

в [Setup] разделе. Смотрите: ChangesAssociations

Комментарии:

1. Спасибо за ваш ответ. Но как это работает? На данный момент я пытаюсь: external ‘SHChangeNotify(0x8000000, 0x1000, 0, 0)@Shell32.dll stdcall’; но я получаю синтаксические ошибки.

2. @s0mmer: Это неправильный синтаксис. Во-первых, в объявлении функции должно быть указано только, что такое сигнатура и где находится функция (если она внешняя). Аргументы, которые вы вводите при вызове функции! Кроме того, в MSDN указано, что SHCNE_ASSOCCHANGED должно использоваться с SHCNF_IDLIST , которое равно нулю, а не $1000 .

3. Это очень полезно, когда мы используем inno для других задач, например, для написания небольших программ на pascal . Смотрите http://www.vincenzo.net/isxkb/index.php?title=Writing_quick_Pascal_programs_with_Inno_Setup . Тем более, что ChangesAssociations=yes будет вызываться только в самом конце установки!