//+------------------------------------------------------------------+ //| RunProcess.mqh | //| Copyright 2025, Niquel Mendoza. | //| https://www.mql5.com/es/users/nique_372 | //+------------------------------------------------------------------+ #property copyright "Copyright 2025, Niquel Mendoza." #property link "https://www.mql5.com/es/users/nique_372" #property strict #ifndef WORKFLOWSBYLEO_STEPS_RUNPROCESS_SYNC_MQH #define WORKFLOWSBYLEO_STEPS_RUNPROCESS_SYNC_MQH //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ #include #include "..\\Final\\Orquestador.mqh" //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ class CWorkStepGenericRunCommand : public CWorkflowStep { private: string m_full_command; uint m_timeout_ms; public: CWorkStepGenericRunCommand(void) : CWorkflowStep("PowerShellCommand", "Generic", false, 0) {} ~CWorkStepGenericRunCommand(void) {} //--- bool Init(const CYmlNode& parameters) override final; int Run() override final; }; //--- WORKFLOWS_FACTORY_DEFINE_CREATOR(CWorkStepGenericRunCommand, GenericRunCommand, "PowerShellCommand", "Generic") //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ bool CWorkStepGenericRunCommand::Init(const CYmlNode& parameters) { //--- // AtHomogeo debido a que paraemteres es un ARRAY no obj string command = m_wf.TranslateStr(parameters["run"], ""); m_timeout_ms = m_wf.TranslateNumber(parameters["timeout_segundos"], "300") * 1000; //--- Check if(command == "") { LogError("'run' no puede estar vacio", FUNCION_ACTUAL); return false; } //--- m_full_command = "powershell -NoProfile -NonInteractive -Command \"" + command + "\""; //--- return true; } //+------------------------------------------------------------------+ //| | //+------------------------------------------------------------------+ int CWorkStepGenericRunCommand::Run(void) { //--- Varaibels inciales del proceso PROCESS_INFORMATION pi; STARTUPINFOW si; ZeroMemory(si); si.cb = sizeof(si); //--- Cracions del proceso const int created = CreateProcessW(NULL, m_full_command, NULL, NULL, false, 0x08000000, NULL, NULL, si, pi); if(created == 0) { LogError(StringFormat("Fallo CreateProcessW, last err in kernel 32: %u", kernel32::GetLastError()), FUNCION_ACTUAL); return 1; } //--- Esperamos a que termine const uint wait_result = WaitForSingleObject(pi.hProcess, m_timeout_ms); if(wait_result == 0x00000102) // WAIT_TIMEOUT TerminateProcess(pi.hProcess, 1); //--- Capturamos el codigo de salida uint exit_code = 0; GetExitCodeProcess(pi.hProcess, exit_code); //--- Cerramos handles de proceso e hilo CloseHandle(pi.hProcess); CloseHandle(pi.hThread); //--- En caso de error log y return 1 de fallo if(exit_code != 0) { LogError(StringFormat("Comando fallo exit=%u cmd=%s", exit_code, m_full_command), FUNCION_ACTUAL); return 1; } //--- Exito return 0; } //+------------------------------------------------------------------+ #endif // WORKFLOWSBYLEO_STEPS_RUNPROCESS_SYNC_MQH