#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
будет вызываться только в самом конце установки!