Pokud potřebujete zjistit stav jakékoli služby v systému Windows, můžete jako inspiraci použít následující kód:
{ InteropPermission interopPermission = new InteropPermission(InteropKind::DllInterop); str machineName = "machineName"; str serviceName = "Browser"; DLL dll; DLLFunction dllFunction; int hSCM; Binary binMachineName; Binary binDBName = new Binary("ServicesActive"); // Opens default database, works also in AX 3.0 DLLFunction openServiceFunction; DLLFunction queryServiceStatusFunction; DLLFunction closeServiceHandleFunction; Binary binServiceName; int hService; Binary serviceStatus = new Binary(28); int status; str serviceInfoMsg = "Service is %1."; ; interopPermission.assert(); dll = new DLL("advapi32.dll"); if (dll) { dllFunction = new DLLFunction(dll, "OpenSCManagerA"); if (dllFunction) { dllFunction.arg(ExtTypes::Pointer, ExtTypes::Pointer, ExtTypes::DWord); dllFunction.returns(ExtTypes::DWord); closeServiceHandleFunction = new DLLFunction(dll, "CloseServiceHandle"); if (closeServiceHandleFunction) { closeServiceHandleFunction.arg(ExtTypes::DWord); closeServiceHandleFunction.returns(ExtTypes::DWord); } else { error("Failed to get 'CloseServiceHandle' function."); return; } binMachineName = new Binary(machineName); hSCM = dllFunction.call(binMachineName, binDBName, 0x80000000); if (hSCM) { openServiceFunction = new DLLFunction(dll, "OpenServiceA"); if (openServiceFunction) { openServiceFunction.arg(ExtTypes::DWord, ExtTypes::Pointer, ExtTypes::DWord); openServiceFunction.returns(ExtTypes::DWord); binServiceName = new Binary(serviceName); hService = openServiceFunction.call(hSCM, binServiceName, 0x80000000); if (hService) { queryServiceStatusFunction = new DLLFunction(dll, "QueryServiceStatus"); if (queryServiceStatusFunction) { queryServiceStatusFunction.arg(ExtTypes::DWord, ExtTypes::Pointer); queryServiceStatusFunction.returns(ExtTypes::DWord); queryServiceStatusFunction.call(hService, serviceStatus); status = serviceStatus.dWord(4); switch(status) { case 1: info(strFmt(serviceInfoMsg, "not running")); break; case 2: info(strFmt(serviceInfoMsg, "starting")); break; case 3: info(strFmt(serviceInfoMsg, "stopping")); break; case 4: info(strFmt(serviceInfoMsg, "running")); break; case 5: info(strFmt(serviceInfoMsg, "continue is pending")); break; case 6: info(strFmt(serviceInfoMsg, "pause is pending")); break; case 7: info(strFmt(serviceInfoMsg, "paused")); break; } } else { error("Failed to get 'QueryServiceStatus' function."); closeServiceHandleFunction.call(hService); closeServiceHandleFunction.call(hSCM); return; } closeServiceHandleFunction.call(hService); } else { error(strFmt("Failed to get service '%1'.", serviceName)); closeServiceHandleFunction.call(hSCM); return; } } else { error("Failed to get 'OpenServiceA' function."); closeServiceHandleFunction.call(hSCM); return; } closeServiceHandleFunction.call(hSCM); } else { error("Failed to open service manager."); return; } } else { error("Failed to get 'OpenSCManagerA' function."); return; } } else { error("Failed to load 'advapi32.dll'."); return; } }