C++ 为什么OpenService()没有';检查窗口服务状态时是否不工作?
整个下午我都在处理一个非常混乱的问题,我想通过QueryServiceStatusEx检查windows服务状态,但总是得到0。MSDN说 如果函数失败,则返回值为零。若要扩展 错误信息,请调用GetLastError。“ 为了获得更多的错误信息,我调用GetLastError,错误代码是1 错误\无效\句柄:句柄无效 这是我的代码,例如,我检查窗口服务:“后台处理程序”,我的代码哪里有错?为什么我不能使用OpenService()获得服务SC_句柄C++ 为什么OpenService()没有';检查窗口服务状态时是否不工作?,c++,winapi,C++,Winapi,整个下午我都在处理一个非常混乱的问题,我想通过QueryServiceStatusEx检查windows服务状态,但总是得到0。MSDN说 如果函数失败,则返回值为零。若要扩展 错误信息,请调用GetLastError。“ 为了获得更多的错误信息,我调用GetLastError,错误代码是1 错误\无效\句柄:句柄无效 这是我的代码,例如,我检查窗口服务:“后台处理程序”,我的代码哪里有错?为什么我不能使用OpenService()获得服务SC_句柄 bool-isServiceStart()
bool-isServiceStart()
{
服务状态\过程状态;
SCU经理;
SC_处理服务;
//获取到scm数据库的hadnle
schSCManager=OpenSCManager(
NULL,//本地计算机
NULL,//服务活动数据库
SC_经理_所有访问权限
);
if(NULL==SCHManager){
qDebug()您的条件错误,当QueryServiceStatusEx
返回非零时,您会写入“hahaha始终为0”
删除条件中的!
运算符,或者切换输出的位置。如果条件错误,则在QueryServiceStatusEx
返回非零时写入“hahaha Always is 0”
要么删除条件中的!
操作符,要么切换输出位置。OMG!!!!!我整个下午都在做这个,一直认为我使用了一些错误的参数!!!!真是个白痴!!!OMG!!!!!我整个下午都在做这个,一直认为我使用了一些错误的参数!!!!真是个白痴!!!你的代码不完整;在pa中它似乎缺少一个main()
函数和至少一个#include
。请将您的代码作为问题的一部分,然后我们可以尝试复制并解决它。您还应该阅读。另外,您一直调用GetLastError
太晚了。当它被记录为返回有意义的值时,您需要立即调用它。不要散布它与任何其他代码一起使用,这些代码可以更改GetLastError
的返回值并使其无效。您的代码不完整;特别是,它似乎缺少一个main()
函数和至少一个#include
。请将您的代码作为问题的一部分,然后我们可以尝试复制并解决它。您还应该阅读。另外,您一直调用GetLastError
太晚了。当它被记录为返回有意义的值时,您需要立即调用它。不要散布它可以与任何其他代码一起使用,这些代码可以更改GetLastError
的返回值并使其无效。
bool isServiceStart()
{
SERVICE_STATUS_PROCESS status;
SC_HANDLE schSCManager;
SC_HANDLE schService;
//get hadnle to the scm database
schSCManager = OpenSCManager(
NULL, //local machine
NULL, //services acitive database
SC_MANAGER_ALL_ACCESS
);
if(NULL == schSCManager){
qDebug() << "Open SCManager failed: " << (GetLastError() == ERROR_ACCESS_DENIED);
CloseServiceHandle(schSCManager);
return false;
}
//Get a hadle to the service
QString serviceName = "Spooler";
schService = OpenService(
schSCManager, //database
(LPCTSTR)serviceName.data(),
SERVICE_ALL_ACCESS
);
if(schService == NULL){
qDebug() << "service doesn't exist: " << GetLastError();
CloseServiceHandle(schSCManager);
return false;
}
DWORD dwBytesNeeded;
if(!QueryServiceStatusEx(
schService,
SC_STATUS_PROCESS_INFO, // information level
(LPBYTE) &status, // address of structure
sizeof(SERVICE_STATUS_PROCESS),
&dwBytesNeeded // size needed if buffer is too small
))
{
qInfo() << "service status" << status.dwCurrentState;
}else{
qInfo() << "hahaha alway is 0" <<GetLastError();
}
return false;
}