Rutinas para saber si MySQL esta instalado y corriendo, también para saber en que directorio esta instalado
#DEFINE SC_MANAGER_CONNECT 0x0001
#DEFINE GENERIC_READ 0x80000000
#DEFINE SERVICE_RUNNING 0x00000004
#DEFINE SERVICE_QUERY_CONFIG 0x0001
#DEFINE ERROR_INSUFFICIENT_BUFFER 0x7A
Clear
? "MySQL está Instaldo:", IIf(isServiceInstalled("MySQL"), "SI", "NO")
? "MySQL está Corriendo:", IIf(isServiceRunning("MySQL"), "SI", "NO")
? "Donde se encuentra:", GetServicePath("MySQL")
Function isServiceInstalled(tcServiceName)
Local llResult, lnManager, lnService
llResult = .F.
Declare Integer OpenSCManager In Advapi32.dll Integer, Integer, Integer
Declare Integer OpenService In Advapi32.dll Integer, String, Integer
Declare Integer CloseServiceHandle In Advapi32.dll Integer
lnManager = OpenSCManager(0, 0, SC_MANAGER_CONNECT)
If lnManager <> 0
lnService = OpenService(lnManager, tcServiceName, GENERIC_READ)
If lnService <> 0
CloseServiceHandle(lnService)
llResult = .T.
EndIf
CloseServiceHandle(lnManager)
EndIf
Clear Dlls "OpenSCManager", "OpenService", "CloseServiceHandle"
Return llResult
EndFunc
Function isServiceRunning(tcServiceName)
Local llResult, lnManager, lnService, lcBuffer
Declare Integer OpenSCManager In Advapi32.dll Integer, Integer, Integer
Declare Integer OpenService In Advapi32.dll Integer, String, Integer
Declare Integer CloseServiceHandle In Advapi32.dll Integer
Declare Integer QueryServiceStatus In Advapi32.dll Integer, String
llResult = .F.
lnManager = OpenSCManager(0, 0, SC_MANAGER_CONNECT)
If lnManager <> 0
lnService = OpenService(lnManager, tcServiceName, GENERIC_READ)
If lnService <> 0 then
lcBuffer = Space(1024)
If QueryServiceStatus(lnService, @lcBuffer) <> 0
llResult = CToBin(Substr(lcBuffer, 5, 4), "4RS") = SERVICE_RUNNING
EndIf
CloseServiceHandle(lnService)
EndIf
CloseServiceHandle(lnManager)
EndIf
Clear Dlls "OpenSCManager", "OpenService", "QueryServiceStatus", "CloseServiceHandle"
Return llResult
EndFunc
Function GetServicePath(tcServiceName)
Local lcResult, lnManager, lnService, lcBuffer, lnSize
Declare Integer OpenSCManager In Advapi32.dll Integer, Integer, Integer
Declare Integer OpenService In Advapi32.dll Integer, String, Integer
Declare Integer CloseServiceHandle In Advapi32.dll Integer
Declare Integer QueryServiceConfig In Advapi32.dll Integer, String@, Integer, Integer@
Declare Integer GetLastError In Kernel32.dll
lcResult = ""
lnManager = OpenSCManager(0, 0, SC_MANAGER_CONNECT)
If lnManager <> 0
lnService = OpenService(lnManager, tcServiceName, SERVICE_QUERY_CONFIG)
If lnService <> 0 then
lcBuffer = ""
lnSize = 0
If QueryServiceConfig(lnService, @lcBuffer, 0, @lnSize) = 0 And GetLastError() = ERROR_INSUFFICIENT_BUFFER
lcBuffer = Space(lnSize)
If QueryServiceConfig(lnService, @lcBuffer, lnSize, 2) = 1
lcResult = JustPath(Substr(lcBuffer, 37, AtC("--defaults", lcBuffer) - 37))
EndIf
EndIf
CloseServiceHandle(lnService)
EndIf
CloseServiceHandle(lnManager)
EndIf
Clear Dlls "OpenSCManager", "OpenService", "QueryServiceConfig", "CloseServiceHandle"
Return lcResult
EndFunc
Muchas gracias, es lo que estaba buscando, y te agradezco el código
ResponderBorrarHola. Excelentes soluciones, pero GetServicePath no está funcionando bien.
ResponderBorrarEn mi ejemplo, estoy buscando la ruta de HKService, al ejecutar QueryServiceConfig, devuelve algo parecido a lo siguiente: (cambié los caracteres no imprimibles)
"# #!##"$"$ "#$ "#$ "#$ "#$" C:\sac\sac\programs\hkServer.exe /iniciar LocalSystem HKServer
En ningún lugar hay un "--defaults", por lo que la siguiente instrucción devuelve una cadena vacía:
lcResult = Justpath(Substr(lcBuffer, 37, Atc("--defaults", lcBuffer) - 37))
Estoy utilizando Windows 10. ¿Alguna sugerencia?