|
syc上构造服务管理器的课时获取服务文件路径及启动类型那一节使用了QUERY_SERVICE_CONFIG
QUERY_SERVICE_CONFIG的使用方法如下:
BOOL QueryServiceConfig(
SC_HANDLE hService,
LPQUERY _SERVICE_CONFIG lpServiceConfig,
DWORD cbBufSize,
LPDWORD pcbBytesNeeded
);
第一个参数为OpenService所打开的具体的服务句柄,第二个参数为指向QUERY_SERVICE_CONFIG的指针,第三个参数为返回值的容量大小,第四个参数为实际还需要的大小。
上课时教的使用方法时先将第二个参数传递NULL,第三个参数传0,然后通过第四个参数来获得还需要空间的大小,然后申请一块内存空间出来用于接受,上课时申请内存时用的是pServCfg = new QUERY_SERVICE_CONFIG[cbBytesNeeded + 1] 。但这样岂不是申请的为cbBytesNeeded+1个QUERY_CONFIG个结构体空间,而不是cbBytesNeeded+1个字节的空间,而实际上我们只需要一个cbBytesNeeded+1大小的内存空间就够了,这样申请相当于多开辟了很多很多内存空间,MSDN上有个例子用的是lpsd = (LPSERVICE_DESCRIPTION) LocalAlloc(LMEM_FIXED, cbBytesNeeded);来申请内存空间。想确认一下是不是老师上课讲的有问题。下面附上老师上课时写的代码(有一定出入,老师写的MFC的程序,我写的是控制台下的):
#include "stdafx.h"
#include "windows.h"
#include "iostream"
#include<string>
#include<typeinfo>
using namespace std;
int main()
{
BOOL bRet = TRUE;
LPCTSTR lpszServName = _T("AlibabaProtect");
SC_HANDLE hSCM = OpenSCManager(NULL, NULL, SC_MANAGER_ALL_ACCESS);
if (hSCM == NULL)
{
cout << "打开服务数据库失败" << endl;
cout << GetLastError() << endl;
return 0;
}
SC_HANDLE hSvc = OpenService(hSCM, lpszServName, SERVICE_QUERY_CONFIG);
if (hSvc == NULL)
{
CloseServiceHandle(hSCM);
cout << "打开服务信息失败" << endl;
cout << GetLastError() << endl;
return 0;
}
QUERY_SERVICE_CONFIG *pServCfg = NULL;
DWORD cbBytesNeeded = 0, cbBufferSize = 0;
bRet = QueryServiceConfig(hSvc, NULL, 0, &cbBytesNeeded);
if (bRet == FALSE)
{
if (GetLastError() == ERROR_INSUFFICIENT_BUFFER)
{
pServCfg = new QUERY_SERVICE_CONFIG[cbBytesNeeded + 1];
ZeroMemory(pServCfg, cbBytesNeeded + 1);
cbBufferSize = cbBytesNeeded;
cbBytesNeeded = 0;
}
else
{
cout << "获取信息失败" << endl;
cout << "错误信息";
cout << GetLastError() << endl;
return 0;
}
}
bRet = QueryServiceConfig(hSvc, pServCfg, cbBufferSize, &cbBytesNeeded);
if (!bRet)
{
cout << "获取信息失败" << endl;
cout << GetLastError() << endl;
CloseServiceHandle(hSCM);
CloseServiceHandle(hSvc);
delete(lpszServName);
lpszServName = NULL;
return 0;
}
CloseServiceHandle(hSCM);
CloseServiceHandle(hSvc);
delete(lpszServName);
lpszServName = NULL;
return 0;
} |
评分
-
参与人数 1 | 驿站币 +2 |
热心值 +2 |
收起
理由
|
thzzl
| + 2 |
+ 2 |
https://www.cctry.com/forum-170-1.html |
查看全部评分
上一篇: 高级窗口班,灰色按钮无法激活下一篇: MFC如何在程序中获取其他程序中的复选框选中
|