目标就是【把exe程序放到制定目录,然后自动把工程需要的dll放到system32目录下,自动注册注册表。】
实现上述需求,用Inno Setup可以非常方便快捷实现。
安装Inno Setup。
点击新建。新建过程可以填写名字、选择图标等等……具体不多说。
之后自动生成了一个iss脚本。在此基础上简单改写,就可以实现我上面讲的需求。
; Script generated by the Inno Setup Script Wizard. ; SEE THE DOCUMENTATION FOR DETAILS ON CREATING INNO SETUP SCRIPT FILES! #define MyAppName "My Program" #define MyAppVersion "1.5" #define MyAppPublisher "My Company, Inc." #define MyAppURL "http://www.example.com/" #define MyAppExeName "MyProg.exe" [Setup] ; NOTE: The value of AppId uniquely identifies this application. ; Do not use the same AppId value in installers for other applications. ; (To generate a new GUID, click Tools | Generate GUID inside the IDE.) AppId={{AC02AFFF-0E81-4E48-AF82-FB09D7BA9F3E} AppName={#MyAppName} AppVersion={#MyAppVersion} ;AppVerName={#MyAppName} {#MyAppVersion} AppPublisher={#MyAppPublisher} AppPublisherURL={#MyAppURL} AppSupportURL={#MyAppURL} AppUpdatesURL={#MyAppURL} DefaultDirName={pf}\{#MyAppName} DisableProgramGroupPage=yes OutputBaseFilename=setup Compression=lzma SolidCompression=yes ArchitecturesInstallIn64BitMode=x64 [Languages] Name: "english"; MessagesFile: "compiler:Default.isl" [Tasks] Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked [Files] Source: "MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion Source: "libmysql.dll"; DestDir: "{sys}";Check: not Is64BitInstallMode Source: "libmysql.dll"; DestDir: "{sys}";Check: Is64BitInstallMode Source: "htmlayout.dll"; DestDir: "{sys}";Check: not Is64BitInstallMode Source: "htmlayout.dll"; DestDir: "{sys}";Check: Is64BitInstallMode ; NOTE: Don't use "Flags: ignoreversion" on any shared system files [Icons] Name: "{commonprograms}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}" Name: "{commondesktop}\{#MyAppName}"; Filename: "{app}\{#MyAppExeName}"; Tasks: desktopicon [Run] Filename: "{app}\{#MyAppExeName}"; Description: "{cm:LaunchProgram,{#StringChange(MyAppName, '&', '&&')}}"; Flags: nowait postinstall skipifsilent
[Files]
下面填写要选择目录安装的MyProg.exe,以及需要自动安装到系统目录的两个dll。
[Files] Source: "MyProg.exe"; DestDir: "{app}"; Flags: ignoreversion Source: "libmysql.dll"; DestDir: "{sys}";Check: not Is64BitInstallMode Source: "libmysql.dll"; DestDir: "{sys}";Check: Is64BitInstallMode Source: "htmlayout.dll"; DestDir: "{sys}";Check: not Is64BitInstallMode Source: "htmlayout.dll"; DestDir: "{sys}";Check: Is64BitInstallMode ; NOTE: Don't use "Flags: ignoreversion" on any shared system files
如果需要注册注册表,需要在[Registry]下面添加。
我给出一个示例写法:
[Registry] ;Root: HKLM; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\Credential Providers\{{6f45dc1e-5384-457a-bc13-2cd81b0d28ed}"; Flags: deletekey Root: HKLM; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\Credential Provider Filters\{{FF032558-38DA-4472-B969-31A636B7E5C7}"; ValueType: string; ValueName: "";ValueData:"SampleAllControlsCredentialProvider";Flags: uninsdeletekey Root: HKLM; Subkey: "SOFTWARE\Microsoft\Windows\CurrentVersion\Authentication\Credential Providers\{{FF032558-38DA-4472-B969-31A636B7E5C7}"; ValueType: string; ValueName: "";ValueData:"SampleAllControlsCredentialProvider";Flags: uninsdeletekey Root: HKCR; Subkey: "CLSID\{{FF032558-38DA-4472-B969-31A636B7E5C7}"; ValueType: string; ValueName:"";ValueData:"SampleAllControlsCredentialProvider";Flags: uninsdeletekey Root: HKCR; Subkey: "CLSID\{{FF032558-38DA-4472-B969-31A636B7E5C7}\InprocServer32"; ValueType: string; ValueName:"";ValueData:"SampleAllControlsCredentialProvider.dll";Flags: uninsdeletekey Root: HKCR; Subkey: "CLSID\{{FF032558-38DA-4472-B969-31A636B7E5C7}\InprocServer32"; ValueType: string; ValueName:"ThreadingModel";ValueData:"Apartment";Flags: uninsdeletekey
写好脚本,进行编译,便生成了我们的setup.exe。
安装目录下,将exe程序以及dll和setup.exe并列放置。点击setup.exe启动安装程序。
效果:
安装之后,会发现dll已经自动放在system32目录下。
如果脚本里写了注册表配置的流程的话,注册表也会自动配置好。
上面只是最简单的例子。我工作暂时就用到这些。
更复杂的逻辑需要在[Code]下面写脚本。Inno Setup提供了一些例子,可以参考学习。