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

【已解决】使用了psvince.dll插件或istask.dll插件,生成的安装包打开特别慢? [复制链接]

上一主题 下一主题
离线solan
 

发帖
80
金钱
800
威望
80
只看楼主 倒序阅读 0 发表于: 2015-12-12
如题,我只要一使用psvince.dll插件或istask.dll插件,安装包打开就特别慢,不用的话就正常,这是什么原因?
我的安装包大小600多MB
离线solan

发帖
80
金钱
800
威望
80
只看该作者 1 发表于: 2015-12-12
  1. [Files]
  2. Source: "embedded\psvince.dll"; Flags: dontcopy noencryption
  3. Source: "embedded\psvince.dll"; DestDir: "{app}";
  4. Source: "embedded\psvince.dll"; DestDir: "{app}\kl 8.5\XX";  
  5. [code]
  6. function IsModuleLoaded(modulename: AnsiString ):  Boolean;
  7. external 'IsModuleLoaded@files:psvince.dll stdcall';
  8. function InitializeSetup():boolean;
  9. var
  10.    IsAppRunning: boolean;
  11. begin
  12.     Result := true;
  13. // 第二步,安装时判断客户端是否正在运行
  14.    begin
  15.     Result:= true;//安装程序继续
  16.     IsAppRunning:= IsModuleLoaded('XXX.exe');
  17.     while IsAppRunning do
  18.        begin
  19.         if MsgBox('安装程序检测到XXX正在运行!' #13#13 '您必须先关闭它然后单击“确定”继续安装,否则按“取消”退出!', mbConfirmation, MB_OKCANCEL) = IDOK then
  20.          begin
  21.          IsAppRunning:= IsModuleLoaded('xxx.exe')
  22.          Result:= true;
  23.          end else begin
  24.          IsAppRunning:= false;
  25.          Result:= false;//安装程序退出
  26.          Exit;
  27.          end;
  28.        end;
  29.      end;
  30. end;
  31. // 卸载时判断xxx是否正在运行
  32. function IsModuleLoadedU(modulename: String ): Boolean;
  33. external 'IsModuleLoaded@{app}\psvince.dll stdcall uninstallonly';
  34. function InitializeUninstall(): Boolean;
  35. var
  36.   IsAppRunning: boolean;
  37. begin
  38.   Result :=true;  //卸载程序继续
  39.   IsAppRunning:= IsModuleLoadedU('xxxx.exe');
  40.   while IsAppRunning do
  41.   begin
  42.     if Msgbox('安装程序检测到xxx正在运行。'  #13#13 '您必须先关闭它然后单击“确定”继续卸载,否则按“取消”退出!', mbConfirmation, MB_OKCANCEL) = IDOK then
  43.     begin
  44.       IsAppRunning:= IsModuleLoadedU('xxxx.exe');
  45.       Result :=true; //卸载程序继续
  46.     end else begin
  47.       Result :=false; //卸载程序退出
  48.       Exit;
  49.     end;
  50.   end;
  51.   UnloadDLL(ExpandConstant('{app}\psvince.dll'));
  52. end;
以上在32位和64位系统都能检测出xxx.exe是否在运行,但是有个问题:由于xxxx.exe 有32位版本和64位版本,,
所以有两个安装包,那么问题来了,某个安装包在安装和卸载时只能检测该版本的xxx.exe是否运行,另一个版本的
xxxx.exe就检测不到,这是问题之一;最只要的问题是如题所说的问题。
请版主在百忙之中帮下忙,谢谢!





离线546242502

发帖
332
金钱
-3060
威望
-306
只看该作者 2 发表于: 2015-12-12
打开慢?是不是 [Files] 段你把 插件和临时文件放在了要安装的程序文件后面,把它们提到[Files] 段开头即可。

第二个问题,奇怪的是我用这个插件做一个 32 位程序安装包在 64 位系统不能检测到有程序运行,我猜测您是不是 64 安装包用的是 64 位安装模式,所以能检测到?
离线solan

发帖
80
金钱
800
威望
80
只看该作者 3 发表于: 2015-12-12
回 2楼(546242502) 的帖子
546242502:打开慢?是不是 [Files] 段你把 插件和临时文件放在了要安装的程序文件后面,把它们提到[Files] 段开头即可。 第二个问题,奇怪的是我用这个插件做一个 32 位程序安装包在 64 位系统不能检测到 .. (2015-12-12 20:02)

第一个问题正如你所说的,我把插件放在要安装的程序文件后面了,我等会儿改了试试
第二个问题:32位安装包没有指定安装模式;64位安装包指定了64位安装模式,两个安装包都只能检测到各自的xxx.exe,这在32位 系统是没问题的,但在64为系统就带来了不便,因为我可能xxxx.exe的两个版本都在运行
感恩你的回话

离线solan

发帖
80
金钱
800
威望
80
只看该作者 4 发表于: 2015-12-12
哦,我随便说一下,你打包的inno安装程序非常好用,看来你做的脚本肯定很不错,好想拿你的脚本学习,因为你做的好多东西我不会,不过我肯定是太唐突了,如果不方便也没关系啦,哈哈。
离线solan

发帖
80
金钱
800
威望
80
只看该作者 5 发表于: 2015-12-12
太好了,首先,安装包打开慢的问题解决了,在此感谢546242502的指点。
其次,关于插件不能检测程序运行的问题也已完美解决。其实插件的检测功能包括32位和64位都是完美的,可能有的朋友没有完全了解插件的使用原理,所以会出问题。其关键是要把插件和需要检测的exe程序放一起就ok了
离线546242502

发帖
332
金钱
-3060
威望
-306
只看该作者 6 发表于: 2015-12-12
回 4楼(solan) 的帖子
solan:哦,我随便说一下,你打包的inno安装程序非常好用,看来你做的脚本肯定很不错,好想拿你的脚本学习,因为你做的好多东西我不会,不过我肯定是太唐突了,如果不方便也没关系啦,哈哈。 (2015-12-12 20:22) 

我写的脚本其实都是依样画葫芦的,没什么技术可言,Dream8 论坛打包的代码更值得学习,说实话,很多自己都看不懂,还是入门级水平;另外,我的打包脚本还存在一些一些问题,比如两个版本安装路径相同时会覆盖安装,还有就是 InnoEx 和 InnoExtractor 右键菜单关联问题,勾选了组件,不关联会出现无效的右键菜单,还有就是开始菜单快捷方式的问题,暂时发现这三个小问题,打算最近这段时间再修正下,就考虑公开吧,不过希望公开以后网上不会各种重打包没什么实质改进的版本满天飞就是了。
离线solan

发帖
80
金钱
800
威望
80
只看该作者 7 发表于: 2015-12-13
嗯嗯,幸苦你了,别人不会这么做的,因为你已经做了,而且做得很好了
我这安装包是打包ug加工软件来的,是我平时编程干活用的,由于原版安装比较麻烦,所以制作LITE版本。
离线solan

发帖
80
金钱
800
威望
80
只看该作者 8 发表于: 2015-12-15
  1. 经过反复测试,发现psvince.dll插件确实有问题,但是也不是网上说的64位系统里检测不到的问题,[/color]
  2. 而是检测不到64位进程,跟系统无关。现在,下面的代码可以解决问题(代码来自网上),就不需要任何插件了:[/color]
  3. // PSVince控件无法检测到64位exe程序的进程,使用下面的函数可以解决。
  4. function IsAppRunning(const FileName: string): Boolean;
  5. var
  6.   FWMIService: Variant;
  7.   FSWbemLocator: Variant;
  8.   FWbemObjectSet: Variant;
  9. begin
  10.   Result := false;
  11.   FSWbemLocator := CreateOleObject('WBEMScripting.SWBEMLocator');
  12.   FWMIService := FSWbemLocator.ConnectServer('', 'root\CIMV2', '', '');
  13.   FWbemObjectSet := FWMIService.ExecQuery(Format('SELECT Name FROM Win32_Process Where Name="%s"',[FileName]));
  14.   Result := (FWbemObjectSet.Count > 0);
  15.   FWbemObjectSet := Unassigned;
  16.   FWMIService := Unassigned;
  17.   FSWbemLocator := Unassigned;
  18. end;
  19. function InitializeSetup():boolean;
  20. var
  21.    IsRunning: boolean;
  22. // 第二步,安装时判断客户端是否正在运行,注意:使用IsAppRunning函数(已在前面定义),
  23.     //可以在32和64位系统下检测32和64位进程,但还是不能识别进程的版本,如果有多版本的话。
  24.     begin
  25.       Result:= true;//安装程序继续
  26.       IsRunning:= IsAppRunning('ugraf.exe');
  27.       while IsRunning do
  28.          begin
  29.            if MsgBox('安装程序检测到 UG软件 正在运行!' #13#13 '您必须先关闭所有正在运行的UG软件,然后单击“确定”继续安装,否则按“取消”退出!', mbConfirmation, MB_OKCANCEL) = IDOK then
  30.              begin
  31.              IsRunning:= IsAppRunning('ugraf.exe');
  32.              Result:= true;
  33.              end else begin
  34.              IsRunning:= false;
  35.              Result:= false;//安装程序退出
  36.              Exit;
  37.              end;
  38.          end;
  39.      end;





离线solan

发帖
80
金钱
800
威望
80
只看该作者 9 发表于: 2015-12-15
希望对大家有帮助