差異處

這裏顯示兩個版本的差異處。

連向這個比對檢視

Both sides previous revision 前次修改
下次修改
前次修改
cpp:sc:queryservicelockstatus [2016/04/19 11:54]
tony [How to?]
cpp:sc:queryservicelockstatus [2023/06/25 09:48] (目前版本)
行 1: 行 1:
-{{tag>​cpp Windows}}+{{tag>​cpp Windows ​SCM}}
 ====== QueryServiceLockStatus ​ ====== ====== QueryServiceLockStatus ​ ======
 ===== Introduction ===== ===== Introduction =====
行 10: 行 10:
 因此,我們可以先檢查SCM database是否lock,再決定我們接下來該怎麼做。 因此,我們可以先檢查SCM database是否lock,再決定我們接下來該怎麼做。
 ===== How to? ===== ===== How to? =====
 +要解決這問題,可以使用:​
 +  * API: QueryServiceLockStatus。
 +  * Command line: sc querylock。
 +首先來看看QueryServiceLockStatus:​
 <code cpp> <code cpp>
 BOOL IsSCMRelease(){ BOOL IsSCMRelease(){
行 20: 行 24:
  
  if (hSCManager) {  if (hSCManager) {
 + hStatus = (LPQUERY_SERVICE_LOCK_STATUS) LocalAlloc(LPTR,​ sizeof(QUERY_SERVICE_LOCK_STATUS)+256);​
 + if( hStatus == NULL ) {
 + clog << "​LocalAlloc failed. Error: " << GetLastError() << endl;
 + return FALSE;
 + }
  
- QueryServiceLockStatus( hSCManager, hStatus, sizeof(QUERY_SERVICE_LOCK_STATUS)+256,​ &​dwBytesNeeded); + if( !QueryServiceLockStatus( hSCManager, hStatus, sizeof(QUERY_SERVICE_LOCK_STATUS)+256,​ &​dwBytesNeeded)){ 
-  + clog << "​Can'​t query lock status. Error: " << GetLastError() << endl
- CloseServiceHandle(hSCManager); + ret = FALSE;
- +
- if(hStatus) { +
- ret = hStatus->​fIsLocked;​ +
- LocalFree(hStatus);+
  } else {  } else {
- clog << "​Can'​t query lock status."​ << endl; + ret = hStatus->​fIsLocked == 0;
- return FALSE;+
  }  }
  
 + CloseServiceHandle(hSCManager);​
 + LocalFree(hStatus);​
  return ret;  return ret;
  }  }
行 40: 行 46:
  return FALSE;  return FALSE;
 } }
 +
 </​code>​ </​code>​
-如果要透過command line,可以使用sc querylock+透過command line:
 <code bash> <code bash>
 C:​\Users\tonylin>​chcp 437 & sc querylock C:​\Users\tonylin>​chcp 437 & sc querylock
行 54: 行 61:
   * [[https://​msdn.microsoft.com/​zh-tw/​library/​windows/​desktop/​ms686321(v=vs.85).aspx|MSDN - StartService]]   * [[https://​msdn.microsoft.com/​zh-tw/​library/​windows/​desktop/​ms686321(v=vs.85).aspx|MSDN - StartService]]
   * [[https://​msdn.microsoft.com/​zh-tw/​library/​windows/​desktop/​ms685104(v=vs.85).aspx|MSDN - SCM Handles]]   * [[https://​msdn.microsoft.com/​zh-tw/​library/​windows/​desktop/​ms685104(v=vs.85).aspx|MSDN - SCM Handles]]
 +  * [[http://​www.tenouk.com/​cpluscodesnippet/​changewindowserviceconfig.html|sample code]]
 +  * [[https://​technet.microsoft.com/​zh-tw/​sqlserver/​ms684953|QUERY_SERVICE_LOCK_STATUS structure]]
 =====    ===== =====    =====
 ---- ----
 \\ \\
 ~~DISQUS~~ ~~DISQUS~~