【发布时间】:2013-06-28 09:13:50
【问题描述】:
我编写了一个Delphi应用程序(基本上是一个用于管理服务的GUI,它具有以下功能:允许用户设置服务使用的一些参数以及启动/停止/unintsall/安装新版本)。 因此,在所有功能中,有一个“行为不正常”:在某个时候,应用程序会尝试卸载并安装新版本的 a 服务。
使用ShellExecute 我运行以下命令:
C:\myPath\myService.exe /Uninstall
C:\myPath\myService.exe /Install // this is tipically done to install a newer version of it
如果服务已经在运行,它会被成功卸载(我收到“成功卸载”消息),但如果我打开 services.msc,我会看到 myService 仍在服务列表中,但它的启动和停止已禁用popupmenu(虽然我希望它根本不列出)。
此时,如果我尝试安装该服务,我会收到以下错误: "指定的服务被标记为删除"
请注意,如果我从命令提示符运行卸载和安装命令,则卸载正常,并且该服务不在 services.msc 列表中。注意:在这种情况下,我的意思是根本不使用 Delphi(或编译的 exe)。
我尝试了许多技巧,包括在卸载后放置 Sleep(10000),但它不起作用我还尝试关闭 services.msc(我读到它可能是打开它的问题)。
我通过以下步骤找到了一个成功的技巧:
1) 我在从 Delphi 调用 Uninstall 后放置了一个断点
2)我去 services.msc :该服务仍在列表中,即使在“刷新”之后它仍然在列表中
3) 我中断(从 IDE:CTRL+F2)应用程序的执行
4)我再次进入 services.msc 我点击“刷新”按钮:myservice 已从列表中删除,因为它应该是
所以我怀疑 Delphi XE2(在 IDE 中调试或运行 exe)以某种方式“锁定服务”不允许它被完全卸载。
注意:该服务是使用另一个 delphi 项目构建的!
您能帮我理解为什么ShellExecute 进行的服务卸载确实会出现此错误吗?
非常感谢。
重要提示: 我忘了提到我使用 IDE 和 cmd.exe 作为管理员。
【问题讨论】:
-
在卸载之前停止服务 (net stop "yourservicename")
-
是的,即使不使用 net stop,但使用 WinSvc 方式,我也会停止它
-
可以直接调用服务管理器的API,为什么还要使用shell execute?使用 SvCom 将使服务 exe 能够通过使用 service.exe /uninstall 进行(卸载)安装,并且它会调用适当的 API 来执行此操作。请注意,尽管从未尝试(卸载)安装我们从 IDE 运行的服务之一。
-
如果还有其他进程具有该服务的当前句柄,则该服务被标记为删除。仔细检查您的代码并关闭您从服务管理器获得的所有句柄。我知道我在 msdn 文档中读过一次有关此内容的信息,但我现在正在使用手机。稍后我会尝试回复并做出正确的回答。
-
@user193655,我写的更多。这能回答你的问题吗?
标签: delphi service delphi-xe2 uninstallation