差異處

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

連向這個比對檢視

Both sides previous revision 前次修改
下次修改
前次修改
cpp:sc:queryservicelockstatus [2016/04/19 11:48]
tony [Introduction]
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);​ 
- QueryServiceLockStatushSCManager, hStatus, sizeof(QUERY_SERVICE_LOCK_STATUS)+256, &​dwBytesNeeded); + if( hStatus ​== NULL ) { 
-  + clog << "​LocalAlloc failed. Error: " << GetLastError() << endl;
- CloseServiceHandle(hSCManager);​ +
- +
- if(hStatus) { +
- ret = hStatus->​fIsLocked;​ +
- LocalFree(hStatus); +
- } else +
  return FALSE;  return FALSE;
 + }
  
 + if( !QueryServiceLockStatus( hSCManager, hStatus, sizeof(QUERY_SERVICE_LOCK_STATUS)+256,​ &​dwBytesNeeded)){
 + clog << "​Can'​t query lock status. Error: " << GetLastError() << endl;
 + ret = FALSE;
 + } else {
 + ret = hStatus->​fIsLocked == 0;
 + }
 +
 + CloseServiceHandle(hSCManager);​
 + LocalFree(hStatus);​
  return ret;  return ret;
  }  }
 +
 + clog << "​Can'​t open SCManager."​ << endl;
  
  return FALSE;  return FALSE;
 } }
 +
 +</​code>​
 +若透過command line:
 +<code bash>
 +C:​\Users\tonylin>​chcp 437 & sc querylock
 +Active code page: 437
 +[SC] QueryServiceLockStatus SUCCESS
 +        IsLocked ​     : FALSE
 +        LockOwner ​    :
 +        LockDuration ​ : 0 (seconds since acquired)
 </​code>​ </​code>​
 ===== Reference ===== ===== Reference =====
行 41: 行 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~~