VC驿站

 找回密码
 加入驿站

QQ登录

只需一步,快速开始

搜索
查看: 545|回复: 1

syc上课讲述服务管理器申请内存问题

[复制链接]
26_avatar_middle
最佳答案
0 
在线会员 发表于 2020-11-13 09:39:42 | 显示全部楼层 |阅读模式
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 收起 理由
58_avatar_small thzzl + 2 + 2 https://www.cctry.com/forum-170-1.html

查看全部评分





上一篇:高级窗口班,灰色按钮无法激活
下一篇:MFC如何在程序中获取其他程序中的复选框选中
63_avatar_middle
最佳答案
0 
donate_vip 发表于 2021-1-7 13:42:42 | 显示全部楼层
我也遇到问题  学习
您需要登录后才可以回帖 登录 | 加入驿站 qq_login

本版积分规则

×【发帖 友情提示】
1、请回复有意义的内容,请勿恶意灌水;
2、纯数字、字母、表情等无意义的内容系统将自动删除;
3、若正常回复后帖子被自动删除,为系统误删的情况,请重新回复其他正常内容或等待管理员审核通过后会自动发布;
4、感谢您对VC驿站一如既往的支持,谢谢合作!

关闭

站长提醒上一条 /2 下一条

QQ|小黑屋|手机版|VC驿站 ( 辽ICP备09019393号-4 )|网站地图wx_jqr

GMT+8, 2021-11-29 17:02

Powered by CcTry.CoM

© 2009-2021 cctry.com

快速回复 返回顶部 返回列表