论坛风格切换切换到宽版
  • 343阅读
  • 9回复

[已解决]老虎哥,安装与卸载检测文件和安装前卸载老版本代码怎么合并? [复制链接]

上一主题 下一主题
离线bby4061751
 

发帖
72
金钱
730
威望
73
只看楼主 倒序阅读 0 发表于: 01-11
如果单用安装与卸载检测文件代码一切正常,加了安装前卸载老版本代码后只有安装与卸载检测文件代码可以用
跟上次你帮我的那个代码一样,只是这次是根据ISTask.dll插件了
以下是我的代码:

; 脚本用 Inno Setup 脚本向导 生成。
; 查阅文档获取创建 INNO SETUP 脚本文件的详细资料!

#define MyAppName "我的程序"
#define MyAppVersion "2.0.1.1"
#define MyAppPublisher "汉化新世纪"
#define MyAppURL "http://bbs.hanzify.org"
#define MyAppExeName "OneKey.exe"

[Setup]
; 注意: AppId 的值是唯一识别这个程序的标志。
; 不要在其他程序中使用相同的 AppId 值。
; (在编译器中点击菜单“工具 -> 产生 GUID”可以产生一个新的 GUID)
AppId={{我的程序}
AppName=我的程序
AppVersion=1.5
;AppVerName=我的程序 1.5
AppPublisher=我的公司
AppPublisherURL=http://www.example.com/
AppSupportURL=http://www.example.com/
AppUpdatesURL=http://www.example.com/
DefaultDirName={pf}\我的程序
DefaultGroupName=我的程序
OutputDir=E:\本地下载\inno编译目录
OutputBaseFilename=setup
Compression=lzma
SolidCompression=yes

[Code]
function RunTask1(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@files:ISTask.dll stdcall delayload';
function KillTask1(ExeFileName: string): Integer;
external 'KillTask@files:ISTask.dll stdcall delayload';
function RunTask(FileName: string; bFullpath: Boolean): Boolean;
external 'RunTask@{app}\ISTask.dll stdcall uninstallonly';
function KillTask(ExeFileName: string): Integer;
external 'KillTask@{app}\ISTask.dll stdcall uninstallonly';


procedure InitializeWizard();
var
ResultStr: String;
ResultCode: Integer;


begin
if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{我的程序}_is1','UninstallString', ResultStr) then
//_is1 注册信息
begin
ResultStr := RemoveQuotes(ResultStr);
Exec(ResultStr, '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode);
end;
end;

function InitializeSetup(): Boolean;
begin
Result:= true;
if RunTask1('OneKey.exe', false) then
if MsgBox('安装程序检测到 OneKey.exe 正在运行!'#13''#13'单击“是”按钮关闭程序并继续安装!'#13''#13'单击“否”按钮则退出安装程序!',mbConfirmation, MB_OKCANCEL) = IDOK then
KillTask1('OneKey.tmp')
else begin
Result :=false;

end;
end;


function InitializeUninstall(): Boolean;
begin
Result:= true;
if RunTask('OneKey.exe', false) then
if MsgBox('卸载程序检测到 OneKey.exe 正在运行!'#13''#13'单击“是”按钮关闭程序并进行卸载!'#13''#13'单击“否”按钮则退出安装程序!',mbConfirmation, MB_OKCANCEL) = IDOK then
KillTask('OneKey.tmp')
else begin
Result :=false;
end;
UnloadDll(ExpandConstant('{app}\ISTask.dll'))

end;

[Languages]
Name: "default"; MessagesFile: "compiler:Default.isl"

[Tasks]
Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked

[Files]
Source: "E:\本地下载\inno编译目录\{app}\ISTask.dll"; DestDir: "{app}"; Flags: solidbreak
Source: "E:\本地下载\inno编译目录\{app}\OneKey.exe"; DestDir: "{app}"; Flags: ignoreversion
; 注意: 不要在任何共享的系统文件使用 "Flags: ignoreversion"

[Icons]
Name: "{group}\我的程序"; Filename: "{app}\OneKey.exe"
Name: "{group}\{cm:UninstallProgram,我的程序}"; Filename: "{uninstallexe}"
Name: "{commondesktop}\我的程序"; Filename: "{app}\OneKey.exe"; Tasks: desktopicon

[Run]
Filename: "{app}\OneKey.exe"; Description: "{cm:LaunchProgram,我的程序}"; Flags: nowait postinstall skipifsilent
离线gnatix

发帖
6912
金钱
7500
威望
750
只看该作者 1 发表于: 01-12
两处
KillTask('OneKey.tmp')
应该是
KillTask('OneKey.exe')
离线gnatix

发帖
6912
金钱
7500
威望
750
只看该作者 2 发表于: 01-12
建议作些改进,以便更有逻辑。

卸载程序:等用户确认要进行卸载后再检查进程是否正在运行,如果用户不确认杀除进程则终止卸载。

安装程序:先检查是否已经安装,如果已经安装了则自动卸载,如果卸载成功则继续安装,否则终止安装。

  1. #define MyAppName "我的程序"
  2. #define MyAppVersion "2.0.1.1"
  3. #define MyAppPublisher "汉化新世纪"
  4. #define MyAppURL "[url=http://bbs.hanzify.org/]http://bbs.hanzify.org[/url]"
  5. #define MyAppExeName "OneKey.exe"
  6. [Setup]
  7. ; 注意: AppId 的值是唯一识别这个程序的标志。
  8. ; 不要在其他程序中使用相同的 AppId 值。
  9. ; (在编译器中点击菜单“工具 -> 产生 GUID”可以产生一个新的 GUID)
  10. AppId={{我的程序}
  11. AppName=我的程序
  12. AppVersion=1.5
  13. ;AppVerName=我的程序 1.5
  14. AppPublisher=我的公司
  15. AppPublisherURL=http://www.example.com/
  16. AppSupportURL=http://www.example.com/
  17. AppUpdatesURL=http://www.example.com/
  18. DefaultDirName={pf}\我的程序
  19. DefaultGroupName=我的程序
  20. OutputDir=E:\本地下载\inno编译目录
  21. OutputBaseFilename=setup
  22. Compression=lzma
  23. SolidCompression=yes
  24. [Languages]
  25. Name: "default"; MessagesFile: "compiler:Default.isl"
  26. [Tasks]
  27. Name: "desktopicon"; Description: "{cm:CreateDesktopIcon}"; GroupDescription: "{cm:AdditionalIcons}"; Flags: unchecked
  28. [Files]
  29. Source: "E:\本地下载\inno编译目录\{app}\ISTask.dll"; DestDir: "{app}"; Flags: solidbreak
  30. Source: "E:\本地下载\inno编译目录\{app}\OneKey.exe"; DestDir: "{app}"; Flags: ignoreversion
  31. ; 注意: 不要在任何共享的系统文件使用 "Flags: ignoreversion"
  32. [Icons]
  33. Name: "{group}\我的程序"; Filename: "{app}\OneKey.exe"
  34. Name: "{group}\{cm:UninstallProgram,我的程序}"; Filename: "{uninstallexe}"
  35. Name: "{commondesktop}\我的程序"; Filename: "{app}\OneKey.exe"; Tasks: desktopicon
  36. [Run]
  37. Filename: "{app}\OneKey.exe"; Description: "{cm:LaunchProgram,我的程序}"; Flags: nowait postinstall skipifsilent
  38. [Code]
  39. function RunTask1(FileName: string; bFullpath: Boolean): Boolean;
  40.   external [email]'RunTask@files:ISTask.dll[/email] stdcall delayload';
  41. function KillTask1(ExeFileName: string): Integer;
  42.   external [email]'KillTask@files:ISTask.dll[/email] stdcall delayload';
  43. function RunTask(FileName: string; bFullpath: Boolean): Boolean;
  44.   external [email]'RunTask@{app}\ISTask.dll[/email] stdcall uninstallonly';
  45. function KillTask(ExeFileName: string): Integer;
  46.   external [email]'KillTask@{app}\ISTask.dll[/email] stdcall uninstallonly';
  47. function InitializeSetup(): Boolean;
  48. var
  49.   ResultStr: String;
  50.   ResultCode: Integer;
  51. begin
  52. Result:= true;
  53. if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{我的程序}_is1','UninstallString', ResultStr) then
  54. //_is1 注册信息
  55.   begin
  56.   ResultStr := RemoveQuotes(ResultStr);
  57.   Exec(ResultStr, '', '', SW_SHOWNORMAL, ewWaitUntilTerminated, ResultCode);
  58.   if RegQueryStringValue(HKLM, 'SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\{我的程序}_is1','UninstallString', ResultStr) then
  59.     begin
  60.     Result:= false;
  61.     Exit;
  62.     end;
  63.   end;
  64. if RunTask1('OneKey.exe', false) then
  65.   if MsgBox('安装程序检测到 OneKey.exe 正在运行!'#13''#13'单击“是”按钮关闭程序并继续安装!'#13''#13'单击“否”按钮则退出安装程序!',mbConfirmation, MB_OKCANCEL) = IDOK then
  66.     KillTask1('OneKey.exe')
  67.   else begin
  68.     Result :=false;
  69.     end;
  70. end;
  71. procedure CurUninstallStepChanged (CurUninstallStep: TUninstallStep);
  72. begin
  73. if CurUninstallStep = usUninstall then
  74.   begin
  75.   if RunTask('OneKey.exe', false) then
  76.     if MsgBox('卸载程序检测到 OneKey.exe 正在运行!'#13''#13'单击“是”按钮关闭程序并进行卸载!'#13''#13'单击“否”按钮则退出安装程序!',mbConfirmation, MB_OKCANCEL) = IDOK then
  77.       KillTask('OneKey.exe')
  78.     else
  79.       Abort;
  80.   UnloadDll(ExpandConstant('{app}\ISTask.dll'));
  81.   end;
  82. end;

离线bby4061751

发帖
72
金钱
730
威望
73
只看该作者 3 发表于: 01-12
两处
KillTask('OneKey.tmp')
应该是KillTask('OneKey.exe')
老虎哥你说的这两处我知道,可是这个工具的KillTask的确是Onekey.tmp。因为进程里有两个,一个是Onekey.exe和Onekey.tmp,只有tmp才能杀死它!
离线gnatix

发帖
6912
金钱
7500
威望
750
只看该作者 4 发表于: 01-12
那就在2楼的代码中还是用 KillTask('OneKey.tmp') 就行了。
离线bby4061751

发帖
72
金钱
730
威望
73
只看该作者 5 发表于: 01-13
虎哥你的这个代码有好几处报错,但我自己修改了几处已完美解决!谢谢老虎版主!!无法用语言形容了!
离线bby4061751

发帖
72
金钱
730
威望
73
只看该作者 6 发表于: 01-13
虎哥你的这个代码有好几处报错,但我自己修改了几处已完美解决!谢谢老虎版主!!无法用语言形容了!
离线gnatix

发帖
6912
金钱
7500
威望
750
只看该作者 7 发表于: 01-13
报错可能与你使用的 INNO 版本有关系。建议用 Restools 的增强版。
离线bby4061751

发帖
72
金钱
730
威望
73
只看该作者 8 发表于: 01-14
回 7楼(gnatix) 的帖子
gnatix:报错可能与你使用的 INNO 版本有关系。建议用 Restools 的增强版。 (2012-01-13 20:01) 

我就是用阿信的增强版的,只是我只用编译器替换d8团队版的编译器,我找不到完整的阿信增强版,能给个下载连接吗?谢谢了
离线gnatix

发帖
6912
金钱
7500
威望
750
只看该作者 9 发表于: 01-14