【发布时间】:2012-04-09 18:23:38
【问题描述】:
我正在编写一个创建 Windows 服务的 C 应用程序。我想在尝试调用安装函数之前检查该服务是否已安装,但我无法找到如何检查它。
我已经写了上面的代码来试试:
DWORD InstallMyService()
{
char strDir[1024 + 1];
SC_HANDLE schSCManager;
SC_HANDLE schService;
LPCTSTR lpszBinaryPathName;
if (GetCurrentDirectory(1024, strDir) == 0)
{
aff_error("GetCurrentDirectory");
return FALSE;
}
strcat(strDir, "\\"MY_SERVICE_BIN_NAME);
if ((schSCManager = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS)) == NULL)
{
printf("Error OpenSCManager : %d\n", GetLastError());
return FALSE;
}
lpszBinaryPathName = strDir;
schService = CreateService(schSCManager, MY_SERVICE_NAME, MY_SERVICE_DESCRIPTOR,
SERVICE_ALL_ACCESS, SERVICE_WIN32_OWN_PROCESS, SERVICE_AUTO_START, SERVICE_ERROR_NORMAL,
lpszBinaryPathName, NULL, NULL, NULL, NULL, NULL);
if (schService == NULL)
{
printf("Error CreateService : %d\n", GetLastError());
return FALSE;
}
CloseServiceHandle(schService);
return TRUE;
}
但此代码不会检测服务是否仍然存在。有人知道要调用哪个函数吗?我发现很多帖子都在讨论这个问题,但不是在 C 中,而是在 C# 或 VB 中。
谢谢。
【问题讨论】:
-
出了什么问题?是
OpenSCManager电话还是GetServiceKeyName电话? -
看来,只有当服务仍然被创建时,OpenSCManager 才会失败。
-
您自己安装软件吗?为什么不创建一个注册表项来告诉您它是否已安装?我不认为您可以查询已安装的专门。您可以尝试使用
OpenService打开服务,如果失败,则表明该服务未安装,但也可能意味着它未正确配置。
标签: c visual-studio-2010 winapi service