Inno Setup不支持本地创建硬链接。
我不会去考虑mklink
外部应用程序。这是一个内置的Windows工具。所以如果你不需要支持Windows XP,你可以放心地依靠它。或者,如果mklink
不可用,则可以回退到定期安装DLL。
还是从Code
部分使用CreateHardLink
function。
#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;
(测试Unicode版本Inno Setup的的)
和卸载
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
创建了一个硬链接。硬链接是对相同内容的另一个参考。基本上硬链接与原文件没有区别(甚至是原始文件是固网实际上)。原始文件和硬链接都只是对相同内容的引用。如果删除原始文件(或新的硬链接),则实际上只删除一个对内容的引用。内容仍然保留。内容仅在最后一个参考中被删除。硬链接不会占用磁盘上的额外空间(内容仅存储一次)。
详情请参阅Hard link article on Wikipedia。
默认情况下,mklink
创建符号链接(又名符号链接)。符号链接就像一个快捷方式,它是对原始文件(而不是内容)的引用。这是一个独立的文件,它包含目标文件的路径。符号链接具有自己的大小(由目标文件的引用占用)。如果删除原始文件,则符号链接仍然存在(因为没有引用来自原始文件的符号链接),但变为无效(内容已消失)。再次,它类似于一条捷径。
详情请参阅Symbolic link article on Wikipedia。
您可以创建一个固网与mklink
,如果添加/H
开关:
/H创建硬链接,而不是符号链接。
如果你想创建符号链接而不是硬链接,这是一个不同的问题(虽然答案很简单,使用CreateSymbolicLink
function)。虽然再次,请注意,硬链接不会占用磁盘上的额外空间,这似乎是您的担心。所以我相信你应该继续使用CreateHardLink
函数。
感谢您的回答。我将澄清一些事情:1. DLL不是我的(它是InnoSetup的VCL样式),那么我不能开发一个函数来重新编译。 2.我们可以将mklink.exe视为外部应用程序,其意义不在于Inno Setup的部分内容,许多Windows使用NTLite,WinToolKit等工具“减少”,或者只能由用户手动删除,因为不是一个重要的应用程序。 – ElektroStudios
然后,如果我可以从Inno Setup上的pascal-script调用WinAPI的** CreateHardLink **函数,这可能是一个有效的解决方案。以我在问题中给出的例子,你能解释我该如何开发脚本,何时给它打电话?再次感谢。 – ElektroStudios
看到我编辑的答案。 –