c++中从location读取访问冲突

Access violation reading from location in C++

本文关键字:访问冲突 读取 location 中从 c++      更新时间:2023-10-16

为什么最后一条语句抛出访问冲突?

我想把一个服务的状态写进一个XML文件。

#define STR_SERVICE_STATUS_INPUT__XML_CONTENT  _T("<SERVICE NAME = "%s" STARTUP_TYPE = "0x%d" />rnrn")
CString         csWriteBufferTemp;
DWORD           dwBufferSize;
DWORD           dwBytesNeeded;
SC_HANDLE       schHandle;

LPQUERY_SERVICE_CONFIG      st_lpqscServiceInfo;
schHandle  = OpenService(IN_schHandle, (CString)cArgentServices[i], SERVICE_QUERY_CONFIG);
bRC = QueryServiceConfig(schHandle, NULL, 0, &dwBytesNeeded);
dwBufferSize        = dwBytesNeeded;    //Size needed.
st_lpqscServiceInfo = (LPQUERY_SERVICE_CONFIG) LocalAlloc(LMEM_FIXED, dwBufferSize);
bRC = QueryServiceConfig(schHandle, st_lpqscServiceInfo, dwBufferSize, &dwBytesNeeded);
    csWriteBufferTemp.Format(STR_SERVICE_STATUS_INPUT__XML_CONTENT__,st_lpqscServiceInfo->lpDisplayName,0);

您几乎肯定在_T("<SERVICE NAME = "%S" STARTUP_TYPE = "0x%d" />rnrn")中使用了错误的字符串格式参数。SERVICE_QUERY_CONFIG和CString的lpServiceStartName成员都是基于char的,所以无论是否在Unicode模式下编译,它们都应该具有匹配的字符类型。在这种情况下,您应该使用%s而不是%s。

谢谢你的回复和建议,我在另一个网站上找到了答案。我不知道这是不是正确的方法,但它是有效的!

LPQUERY_SERVICE_CONFIG
            st_lpqscServiceInfo;
SC_HANDLE       schHandle;
st_lpqscServiceInfo = (LPQUERY_SERVICE_CONFIG) LocalAlloc(LPTR, 4096);
schHandle   = OpenSCManager(IN_pszMachineName,SERVICES_ACTIVE_DATABASE, SERVICE_QUERY_CONFIG);
bRC = QueryServiceConfig(schHandle, st_lpqscServiceInfo, dwBufferSize, &dwBytesNeeded);
csWriteBufferTemp.Format(STR_SERVICE_STATUS_INPUT__XML_CONTENT__,st_lpqscServiceInfo->lpDisplayName,0);