做系统服务管理程序遇到问题了,QueryServiceConfig()

etz2008 2008-11-21 10:49:49
做系统服务管理程序遇到问题了,QueryServiceConfig()
始终得不到服务程序的路径,大家看哈



...全文
502 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
一个印坊小生 2011-03-08
  • 打赏
  • 举报
回复
要学习。。
hrjdsht 2010-06-18
  • 打赏
  • 举报
回复
怎么看不到
liyu355 2010-03-16
  • 打赏
  • 举报
回复
QUERY_SERVICE_CONFIG *psevStatus = (QUERY_SERVICE_CONFIG *)malloc(MAX_PATH);
if (psevStatus == NULL)
return -1;

DWORD dwNeed =0;
DWORD dwInputLen = MAX_PATH;
if (!QueryServiceConfig(hardOpen, psevStatus, dwInputLen, &dwNeed))
{
free(psevStatus);
psevStatus = (QUERY_SERVICE_CONFIG *)malloc(dwNeed);
dwInputLen = dwNeed;
QueryServiceConfig(hardOpen, psevStatus, dwInputLen, &dwNeed);
}
if (psevStatus != NULL)
{
free(psevStatus);
psevStatus = NULL;
}

类似这样的,可能会更好点,不要使用最大值。因为内存分配给你了,就算你当时释放掉内存了,系统也是得不到你释放的内存的。能少分配,就少分配一些的好
bainan 2009-04-27
  • 打赏
  • 举报
回复
我也遇到这个问题,搜到了这里,问题也解决了!
sosochina 2009-04-13
  • 打赏
  • 举报
回复
哈呵,不错前段时间刚碰到这个问题
  • 打赏
  • 举报
回复
学习了。签名留念!
cnzdgs 2008-11-22
  • 打赏
  • 举报
回复
QueryServiceConfig的参数也要跟着改成8*1024。
etz2008 2008-11-22
  • 打赏
  • 举报
回复
还是不对
其实理论上也没什么错的啊
etz2008 2008-11-22
  • 打赏
  • 举报
回复
嗯 好

谢谢哈!

对了

这个问题

弄得我办天没解决好呢

给分了

呵呵
cnzdgs 2008-11-21
  • 打赏
  • 举报
回复
QueryServiceConfig的缓冲区最大8KB,初始化时用new分配即可,最后记得delete。
LPQUERY_SERVICE_CONFIG ServicesInfo = (LPQUERY_SERVICE_CONFIG)new BYTE[8*1024];
etz2008 2008-11-21
  • 打赏
  • 举报
回复
void CServerMangerDlg::GetServerItem()
{
CRect rect;
m_Server.GetWindowRect(&rect);

m_Server.SetExtendedStyle(LVS_EX_FULLROWSELECT |LVS_EX_GRIDLINES );
int m_Width=rect.right-rect.left;
m_Width=(m_Width-20)/5;

m_Server.InsertColumn(0,"服务名称",LVCFMT_LEFT,m_Width,0);
m_Server.InsertColumn(1,"显示名称",LVCFMT_LEFT,m_Width,1);
m_Server.InsertColumn(2,"启动状态",LVCFMT_LEFT,m_Width,2);
m_Server.InsertColumn(3,"启动类型",LVCFMT_LEFT,m_Width,3);
m_Server.InsertColumn(4,"程序路径",LVCFMT_LEFT,m_Width,4);


SC_HANDLE scm;

if((scm=::OpenSCManager(NULL,NULL,SC_MANAGER_ALL_ACCESS))==NULL)
{
MessageBox("OpenSCManager Error\n");
return;
}

LPENUM_SERVICE_STATUS lpServices= NULL; //定义
DWORD nSize = 0;
DWORD n;
DWORD nResumeHandle=0;
lpServices=(LPENUM_SERVICE_STATUS)LocalAlloc(LPTR, 64*1024);//分配内存

::EnumServicesStatus(scm,SERVICE_WIN32,SERVICE_STATE_ALL,lpServices,
64*1024,&nSize,&n,&nResumeHandle);

LPQUERY_SERVICE_CONFIG ServicesInfo = NULL;
UINT m_Current=m_Server.GetItemCount();

for(int i=0;i<n;i++)
{
SC_HANDLE service=NULL;
DWORD nResumeHandle=0;

m_Server.InsertItem(m_Current,lpServices[i].lpServiceName,0);
m_Server.SetItemText(m_Current,1,lpServices[i].lpDisplayName);
if(lpServices[i].ServiceStatus.dwCurrentState!=SERVICE_STOPPED)
m_Server.SetItemText(m_Current,2,"已启动");
else
m_Server.SetItemText(m_Current,2,"未启动");

CString str;
service=OpenService(scm,lpServices[i].lpServiceName,SERVICE_QUERY_CONFIG);
ServicesInfo=(LPQUERY_SERVICE_CONFIG)LocalAlloc(LPTR,64*1024); //注意分配足够的空间
if(!::QueryServiceConfig(service,ServicesInfo,64*1024,&nResumeHandle))
{ if(GetLastError()==ERROR_INVALID_HANDLE)
str.Format("%d==ERROR_INVALID_HANDLE",GetLastError());
MessageBox(str);
return; //枚举各个服务信息
}
if(SERVICE_AUTO_START==ServicesInfo->dwStartType) //启动方式
{
m_Server.SetItemText(m_Current,4,"自动");
}
if(SERVICE_DEMAND_START==ServicesInfo->dwStartType)
{
m_Server.SetItemText(m_Current,4,"手动");
}
if(SERVICE_DISABLED==ServicesInfo->dwStartType)
{
m_Server.SetItemText(m_Current,4,"禁止");
}

m_Server.SetItemText(m_Current,3,ServicesInfo->lpBinaryPathName);
CloseServiceHandle(service);
m_Current++;
}
CloseServiceHandle(scm);
}

源代码如上

15,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧