2014-07-21 49 views
-1

爲什麼最後一條語句拋出Access Violation?從C++中的位置讀取訪問衝突

我想將服務的狀態寫入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); 

回答

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

幾乎可以肯定地使用_T("<SERVICE NAME = \"%S\" STARTUP_TYPE = \"0x%d\" />\r\n\r\n")中錯誤的字符串格式參數。 SERVICE_QUERY_CONFIG和CString的lpServiceStartName成員都是基於TCHAR的,因此它們應該具有匹配的字符類型,無論您是否使用Unicode模式進行編譯。在這種情況下,您應該使用%s而不是%S。

+0

謝謝@TheUndeadFish的答覆,但仍然不能解決我的問題。我按照你的建議編輯了問題。 – sidx

+0

@sidx如果格式崩潰,沒有太多的可能性。您是否驗證過st_lpqscServiceInfo正在分配並且大小正確?第二個QueryServiceConfig調用實際上是成功的嗎? st_lpqscServiceInfo-> lpDisplayName出錯了,這與現在您的代碼的唯一合理猜測有關。 – TheUndeadFish

+0

在我的實際代碼中,我正在檢查所有'schHandle'值以查看調用是否成功。他們從不'空'。我也檢查'bRC's。 – sidx