【发布时间】:2011-10-18 13:36:05
【问题描述】:
我需要在我的 C++ 应用程序中获取 Windows“打印后台处理程序”服务的状态。
【问题讨论】:
-
我对 C++ 了解不多,但如果你使用的是 C++.NET,那么我认为你可以使用 System.ServiceProcess.ServiceController。如果不使用.NET,那我不知道。
标签: c++ visual-c++ windows-services
我需要在我的 C++ 应用程序中获取 Windows“打印后台处理程序”服务的状态。
【问题讨论】:
标签: c++ visual-c++ windows-services
@shikarssj 提供的功能完美运行,加载服务时只需要管理员权限。
这是一个不需要完全许可的版本:
#include <Windows.h>
int GetServiceStatus( const char* name )
{
SC_HANDLE theService, scm;
SERVICE_STATUS m_SERVICE_STATUS;
SERVICE_STATUS_PROCESS ssStatus;
DWORD dwBytesNeeded;
scm = OpenSCManager( nullptr, nullptr, SC_MANAGER_ENUMERATE_SERVICE );
if( !scm ) {
return 0;
}
theService = OpenService( scm, name, SERVICE_QUERY_STATUS );
if( !theService ) {
CloseServiceHandle( scm );
return 0;
}
auto result = QueryServiceStatusEx( theService, SC_STATUS_PROCESS_INFO,
reinterpret_cast<LPBYTE>( &ssStatus ), sizeof( SERVICE_STATUS_PROCESS ),
&dwBytesNeeded );
CloseServiceHandle( theService );
CloseServiceHandle( scm );
if( result == 0 ) {
return 0;
}
return ssStatus.dwCurrentState;
}
【讨论】:
我找不到任何使用 WinApi 和 C++ 的好例子。我尝试并编译了以下内容,它在 Borland 中工作。希望这对某人有所帮助。
int getServiceStatus(char* name)
{
SC_HANDLE theService,scm;
SERVICE_STATUS m_SERVICE_STATUS;
SERVICE_STATUS_PROCESS ssStatus;
DWORD dwBytesNeeded;
scm = OpenSCManager(0, 0, SC_MANAGER_CREATE_SERVICE);
if (!scm) {
ShowErr();
return 0;
}
theService = OpenService(scm, name, SERVICE_ALL_ACCESS);
if (!theService) {
CloseServiceHandle(scm);
ShowErr();
return 0;
}
int result = QueryServiceStatusEx(theService, SC_STATUS_PROCESS_INFO, (LPBYTE)
&ssStatus, sizeof(SERVICE_STATUS_PROCESS),
&dwBytesNeeded);
CloseServiceHandle(theService);
CloseServiceHandle(scm);
if (result == 0) return 0; // fail query status
return ssStatus.dwCurrentState;
}
【讨论】:
使用QueryServiceStatus 或QueryServiceStatusEx。网络上有很多关于如何使用它们的示例。
【讨论】: