Inno Setup не поддерживает создание жестких ссылок изначально.
Я бы не рассматривал внешнее приложение mklink
. Это встроенный инструмент Windows. Поэтому, если вам не нужна поддержка Windows XP, вы можете спокойно положиться на нее. Или вы можете вернуться к установке DLL регулярно, если mklink
недоступен.
Или используйте CreateHardLink
function из раздела Code
.
#define MyApp "MyApp"
#define UninstallDll "uninstall.dll"
[Files]
Source: "{#UninstallDll}"; DestDir: "{cf}\{#MyApp}"; \
Flags: ignoreversion uninsneveruninstall
[Code]
function CreateHardLink(lpFileName, lpExistingFileName: string;
lpSecurityAttributes: Integer): Boolean;
external '[email protected] stdcall';
procedure CurStepChanged(CurStep: TSetupStep);
var
ExistingFile, NewFile: string;
begin
if CurStep = ssPostInstall then
begin
ExistingFile := ExpandConstant('{cf}\{#MyApp}\{#UninstallDll}');
NewFile := ExpandConstant('{app}\{#UninstallDll}');
if CreateHardLink(NewFile, ExistingFile, 0) then
begin
Log('Hardlink created');
end
else
if FileCopy(ExistingFile, NewFile, False) then
begin
{ FAT file system? }
Log('Hardlink could not be created, file copied instead');
end
else
begin
MsgBox('Cannot install {#UninstallDll}', mbError, MB_OK);
end;
end;
end;
(Проверено на версии Юникода установки Inno)
И не забудьте удалить файл при удалении
procedure CurUninstallStepChanged(CurUninstallStep: TUninstallStep);
begin
if CurUninstallStep = usUninstall then
begin
if DeleteFile(ExpandConstant('{app}\{#UninstallDll}')) then
begin
Log('File deleted');
end
else
begin
Log('Cannot delete file');
end;
end;
end;
Вы можете использования курса также в [UninstallDelete]
записи. Я просто хочу удалить файл, используя ту же технологию, что и для его установки.
Ваш вопрос название является "Создать с жесткой связью Inno Setup".
CreateHardLink
создает hardlink. Жесткая ссылка - это еще одна ссылка на одно и то же содержимое. В основном жесткая ссылка неотличима от исходного файла (даже исходный файл - это hardlink). И исходный файл, и hardlink - это просто ссылки на одно и то же содержимое. Если вы удалите исходный файл (или новую жесткую ссылку), вы фактически удалите только одну ссылку на содержимое. Содержимое сохраняется. Содержимое удаляется только с последней ссылкой.Жесткая ссылка не занимает дополнительное пространство на диске (содержимое хранится только один раз).
Подробнее см. Hard link article on Wikipedia.
В то время как mklink
создает символическую ссылку (или символическую ссылку) по умолчанию. Символьная ссылка похожа на ярлык, это ссылка на исходный файл (не содержимое). Это файл сам по себе, который содержит путь к целевому файлу. Симлинк имеет собственный размер (занятый ссылкой на целевой файл). Если вы удалите исходный файл, символическая ссылка все еще существует (потому что ссылка на символическую ссылку из исходного файла отсутствует), но становится недействительной (содержимое отсутствует). Опять же, это похоже на ярлык.
Подробнее см. Symbolic link article on Wikipedia.
Вы можете создать жесткую связь с mklink
, если добавить переключатель /H
:
/H Создает жесткую ссылку вместо символической ссылки.
Если вы хотите создать символическую ссылку вместо жесткой связи, это другой вопрос (хотя ответ прост, используйте CreateSymbolicLink
function). Хотя еще раз обратите внимание, что жесткая ссылка не занимает дополнительного места на диске, что, по-вашему, вызывает у вас беспокойство. Поэтому я считаю, что вы должны продолжать использовать функцию CreateHardLink
.
Спасибо за ответ. Я проясню некоторые вещи: 1. DLL не моя (ее стили VCL для InnoSetup), тогда я не могу развить функцию для повторной компиляции. 2. Мы можем рассматривать mklink.exe как внешнее приложение в значении, которое не является частью Inno Setup, многие ОС Windows «уменьшены» с помощью таких инструментов, как NTLite, WinToolKit и т. Д., Или просто они могут быть удалены вручную пользователем, не является важным приложением. – ElektroStudios
Тогда, если бы я мог вызвать функцию ** CreateHardLink ** WinAPI из паскаль-скрипта в Inno Setup, которая может быть эффективным решением. Взяв пример, который я дал в моем вопросе, не могли бы вы объяснить, как я могу разработать сценарий и когда его называть? Еще раз спасибо. – ElektroStudios
См. Мой отредактированный ответ. –