从C ++中的位置读取访问冲突

时间:2014-07-21 13:21:33

标签: c++ visual-studio mfc

为什么最后一个语句会引发访问冲突?

我想将服务的状态写入XML文件。

#define STR_SERVICE_STATUS_INPUT__XML_CONTENT  _T("<SERVICE NAME = \"%s\" STARTUP_TYPE = \"0x%d\" />\r\n\r\n")

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);

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

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);