论坛风格切换切换到宽版
  • 12939阅读
  • 10回复

[求助]NSIS 结束服务的问题 [复制链接]

上一主题 下一主题
离线炎之川
 
发帖
5195
金钱
0
威望
0
只看楼主 正序阅读 0 发表于: 2005-06-10
NSIS,用 nsSCM 处理服务,脚本:

QUOTE
# 应用补丁
Section
     SetDetailsPrint none
     File "/oname=$PLUGINSDIR\patch.pat" "${__DIR__}\patch.pat"
     SetDetailsPrint both

     ${SetOutPath} "$INSTDIR"
     
;停止 O&O Defrag 服务
  nsSCM::Stop /NOUNLOAD "O&O Defrag"
     Pop $0


     !insertmacro Patch "oodguirs.dll"
     !insertmacro Patch "oodjobdr.dll"
     !insertmacro Patch "oodpeabr.dll"
     !insertmacro Patch "oodperwr.dll"
     !insertmacro Patch "oodpesur.dll"
     !insertmacro Patch "oodpetpr.dll"
     !insertmacro Patch "oodwizrs.dll"
     !insertmacro Patch "ootip.dll"

     ${SetOutPath} "$SYSDIR"
     !insertmacro Patch "oodbsrs.dll"
     !insertmacro Patch "oodagrs.dll"

;再启动 O&O Defrag 服务
     nsSCM::Start /NOUNLOAD "O&O Defrag"
     Pop $0; return error/success

 
  SetOutPath "$INSTDIR"
  SetOverwrite on
  File "chs\rpcdrv01.htm"
  File "chs\rpcmn01.htm"
  File "chs\汉化说明.txt"

     WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\$(^NameDA)" "DisplayName" "$(^NameDA)"
     WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\$(^NameDA)" "UninstallString" '"$INSTDIR\Uninstall.exe"'
     WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\$(^NameDA)" "DisplayIcon" '"$INSTDIR\Uninstall.exe"'
     WriteUninstaller "$INSTDIR\Uninstall.exe"
     ${RefreshIcon}
SectionEnd


上面脚本应用vpatch的可以不看,关于服务的几行我用红色标出了。

现在的问题就是,发现这样做,服务运行时被系统锁定的system32下的dll文件并未被解除锁定,安装程序会提示无法补丁,是否重试。但是如果点重试,就又可以补丁了。

表述可能不能很明白的说明问题,具体软件就是下面这个,试一试即可看到问题:
http://www.hanzify.org/index.php?Go=Show::List&ID=8023

不知道如何处理,希望能帮忙看看
离线restools

发帖
2848
金钱
1430
威望
143
只看该作者 10 发表于: 2005-06-11
QUOTE(dujuan509 @ 2005年06月11日 12时29分)
可以使用
nsexec::exectostack "net start/stop/pause"
Pop $0
messagebox mb_ok "return:$0"

可以通过返回值判断用户是否足够权限,或者是否超时。
如果返回0,表示执行成功,为1或其他,则失败。
[snapback]217484[/snapback]


还好,不过不知道为什么,自上次作了个 SQLServer 的连接例子之后,我就不喜欢调用控制台程序了,实在是没有一个安装程序的整体感觉,如果因为某些原因,未能访问到这个控制台程序(我觉得调用一个API比调用一个控制台程序要好得多,至少API是调用一个系统DLL,这是必须存在的东西,没有的话,系统就会有问题,而一个控制台程序,因为某些原因被删除了,系统是仍然能够运行的。而且使用控制台程序要依附更多的条件,例如系统的搜索路径出现问题,会令到安装程序出现调用失败),很可能出现某些问题,再者,插件除了调用是否失败的标识外,最重要的是服务状态,可以非常清晰的显示该服务的状态。
----以上只是个人的编程爱好习惯,如果别人仍然喜欢调用外部程序,我也没办法了。

/* Service Types (Bit Mask) */
#define SERVICE_KERNEL_DRIVER       0x00000001
#define SERVICE_FILE_SYSTEM_DRIVER   0x00000002
#define SERVICE_ADAPTER           0x00000004
#define SERVICE_RECOGNIZER_DRIVER     0x00000008

#define SERVICE_DRIVER           (SERVICE_KERNEL_DRIVER | \
                            SERVICE_FILE_SYSTEM_DRIVER | \
                            SERVICE_RECOGNIZER_DRIVER)

#define SERVICE_WIN32_OWN_PROCESS     0x00000010
#define SERVICE_WIN32_SHARE_PROCESS   0x00000020
#define SERVICE_WIN32             (SERVICE_WIN32_OWN_PROCESS | \
                            SERVICE_WIN32_SHARE_PROCESS)

#define SERVICE_INTERACTIVE_PROCESS   0x00000100

#define SERVICE_TYPE_ALL           (SERVICE_WIN32   | \
                            SERVICE_ADAPTER | \
                            SERVICE_DRIVER | \
                            SERVICE_INTERACTIVE_PROCESS)

/* Start Type */
#define SERVICE_BOOT_START         0x00000000
#define SERVICE_SYSTEM_START       0x00000001
#define SERVICE_AUTO_START         0x00000002
#define SERVICE_DEMAND_START       0x00000003
#define SERVICE_DISABLED           0x00000004

/* Error control type */
#define SERVICE_ERROR_IGNORE       0x00000000
#define SERVICE_ERROR_NORMAL       0x00000001
#define SERVICE_ERROR_SEVERE       0x00000002
#define SERVICE_ERROR_CRITICAL       0x00000003

/* Service State -- for CurrentState */
#define SERVICE_STOPPED           0x00000001
#define SERVICE_START_PENDING       0x00000002
#define SERVICE_STOP_PENDING       0x00000003
#define SERVICE_RUNNING           0x00000004
#define SERVICE_CONTINUE_PENDING     0x00000005
#define SERVICE_PAUSE_PENDING       0x00000006
#define SERVICE_PAUSED           0x00000007
我的BLOG:   http://restools.hanzify.org (Inno Setup 增强版, 插件 发布站点)
离线dujuan509
发帖
182
金钱
0
威望
0
只看该作者 9 发表于: 2005-06-11
可以使用
nsexec::exectostack "net start/stop/pause"
Pop $0
messagebox mb_ok "return:$0"

可以通过返回值判断用户是否足够权限,或者是否超时。
如果返回0,表示执行成功,为1或其他,则失败。
离线restools

发帖
2848
金钱
1430
威望
143
只看该作者 8 发表于: 2005-06-11
我不认为 net 是很好的方法,因为既然有这么好的插件,何必要调用外部控制台程序,因为插件能够查询每个时刻的服务状态,这是外部程序很难实现的功能,善用他的状态查询功能,你可以实现更加强大的服务 安装/卸载/停止/启动 流程。

以下例子我用了服务 Messenger 来测试。(这是一个经常被人利用来卖广告的服务)
QUOTE( ttt.nsi @ 2005-6-11 11:26:21 )
!include "MUI.nsh"
!include "LogicLib.nsh"

Name "test"
OutFile "Setup.exe"

!insertmacro MUI_LANGUAGE "english"
!insertmacro MUI_PAGE_COMPONENTS
!insertmacro MUI_PAGE_INSTFILES

Section "post"
;  nsSCM::QueryStatus /NOUNLOAD "Messenger"
;  Pop $0 ; 返回 错误/成功
;  Pop $1 ; 返回 服务状态
;  DetailPrint $0
;  DetailPrint $1
;  DetailPrint ""
########### 取消上面的注释可以看看停止服务之前的状态 #################
 
nsSCM::Stop /NOUNLOAD "Messenger"
loop:
  nsSCM::QueryStatus /NOUNLOAD "Messenger"
 
Pop $0 ; 返回 错误/成功
 
Pop $1 ; 返回 服务状态
 
${If} $1 = 1
   
DetailPrint "成功停止服务"
;    DetailPrint $0  ## 取消这里注释可以看看成功停止服务后的服务状态
;    DetailPrint $1
 
${Else}
;    DetailPrint $0    ## 取消这里注释可以看看这个循环状态下的每个时刻的服务状态
;    DetailPrint $1
;    DetailPrint ""
   
Goto loop
  ${EndIf} 
SectionEnd


如果要做得更加完善,应该再加入一个时间段的检测,只要超过时间,就强行停止安装,因为可能用户没有权限停止服务,安装程序可以强行停止安装,请问这样的功能, net 实现起来会比这个插件简单吗?呵呵~~
我的BLOG:   http://restools.hanzify.org (Inno Setup 增强版, 插件 发布站点)
离线炎之川
发帖
5195
金钱
0
威望
0
只看该作者 7 发表于: 2005-06-10
搞定~thx~~~

用 net stop/start 好像效果更好
离线蓝色网际
发帖
1795
金钱
0
威望
0
只看该作者 6 发表于: 2005-06-10
好像 nsExec::Exec 'NET STOP "O&O Defrag"' 这样就行了。
不要在 PM 里问问题,PM 不是用来问问题的。
离线炎之川
发帖
5195
金钱
0
威望
0
只看该作者 5 发表于: 2005-06-10
QUOTE(rexhsu @ 2005年06月10日 22时41分)
停服务我宁愿用nsExec::ExecToStack和net stop结合使用,因为他会等服务完全结束了再继续下面的指令。
[snapback]217383[/snapback]



请举一段脚本的例子,谢谢:)
离线rexhsu
发帖
8
金钱
0
威望
0
只看该作者 4 发表于: 2005-06-10
停服务我宁愿用nsExec::ExecToStack和net stop结合使用,因为他会等服务完全结束了再继续下面的指令。
离线炎之川
发帖
5195
金钱
0
威望
0
只看该作者 3 发表于: 2005-06-10
QUOTE(蓝色网际 @ 2005年06月10日 19时57分)
可能是服务不能马上停止,用 Sleep 来睡几秒看看。
[snapback]217326[/snapback]



问题解决!感谢感谢User Posted Image
离线Snoopy

发帖
2128
金钱
10
威望
1
只看该作者 2 发表于: 2005-06-10
实在不行,倒可以试试 Inno:
http://bbs.hanzify.org/index.php?showtopic...ndpost&p=191132
看到帖子标题,偶万里迢迢、赤身裸体、挥刀自宫、头扎红布、跪碎玻璃、磕头到出血、胸口碎大石、喉头顶钢枪、无视艰难险阻、全身插刀抽搐、求助喝氰化钾、看央视笑傲江湖、欣赏脑白金广告、十里长街卖身跪地、倒立 3600 度后空翻、肩抗 150 公斤杠铃、专程赶过来支持一下子!
图像加密帖