Запуск программы через CMD средствами MQL

 

Прошу помощь, нуждаюсь в коде для функций по запуску программы из MT5 через dll и мониторинга окончания её работы.

В функцию нужно подавать строку на исполнение:

void (string Setup) {}

После подачи строки мониторить через секунду появления программы в режиме CMD - обычное окно типа DOS, где бегут строчки.

Но не ясно, как отследить что окно такое имеется и работа программы ещё не завершена. Нужна подобная функция, которая сообщит о статусе программы - имеется окно или нет.

bool WorkGo(){}

У окна не видно заголовка - просто как обычно путь к файлу cmd.exe .

Возможно эта функция может быть полезной от Microsoft

HWND FindWindowA(
  LPCSTR lpClassName,
  LPCSTR lpWindowName
);

Но как её заставить работать - не понимаю.

Совсем не разбираюсь в dll, а очень надо решить подобную задачу.

 
Aleksey Vyazmikin:

Прошу помощь, нуждаюсь в коде для функций по запуску программы из MT5 через dll и мониторинга окончания её работы.

В функцию нужно подавать строку на исполнение:

После подачи строки мониторить через секунду появления программы в режиме CMD - обычное окно типа DOS, где бегут строчки.

Но не ясно, как отследить что окно такое имеется и работа программы ещё не завершена. Нужна подобная функция, которая сообщит о статусе программы - имеется окно или нет.

У окна не видно заголовка - просто как обычно путь к файлу cmd.exe .

Возможно эта функция может быть полезной от Microsoft

Но как её заставить работать - не понимаю.

Совсем не разбираюсь в dll, а очень надо решить подобную задачу.

Уже не нужно dll, недавно метаквоты ввели поддержку WinAPI, см. папку \MQL5\Include\WinAPI

Конкретно, в файле \MQL5\Include\WinAPI\winuser.mqh видим две unicode функции

HANDLE                              FindWindowExW(HANDLE wnd_parent,HANDLE wnd_child_after,const string class_name,const string window);
HANDLE                              FindWindowW(const string class_name,const string window_name);


 

 
Alexey Volchanskiy:

Уже не нужно dll, недавно метаквоты ввели поддержку WinAPI, см. папку \MQL5\Include\WinAPI

Конкретно, в файле \MQL5\Include\WinAPI\winuser.mqh видим две unicode функции

Вижу Вы в этом деле разбираетесь! Может предметно поможете, а то для меня темный лес, даже не представляю что в эти функции передавать и что они возвратят, в хэлпе ничего не описано :(

К примеру на примере команды ping 127.01.01.01
 
Aleksey Vyazmikin:

Вижу Вы в этом деле разбираетесь! Может предметно поможете, а то для меня темный лес, даже не представляю что в эти функции передавать и что они возвратят, в хэлпе ничего не описано :(

К примеру на примере команды ping 127.01.01.01

Вам нужно запустить команду ping с параметрами. Подключаем файл \MQL5\Include\WinAPI\processthreadsapi.mqh, в нем портирована команда для запуска любых процессов (программ)

int     CreateProcessW(const string application_name,string command_line,PVOID process_attributes,PVOID thread_attributes,int inherit_handles,uint creation_flags,PVOID environment,const string current_directory,STARTUPINFOW &startup_info,PROCESS_INFORMATION &process_information);

За примерами ее использование лезем в гуглу

Вот неплохой примерчик, а можно на сайте поискать

//C++

Копировать
#include <windows.h>
#include <stdio.h>
#include <tchar.h>

void _tmain( int argc, TCHAR *argv[] )
{
    STARTUPINFO si;
    PROCESS_INFORMATION pi;

    ZeroMemory( &si, sizeof(si) );
    si.cb = sizeof(si);
    ZeroMemory( &pi, sizeof(pi) );

    if( argc != 2 )
    {
        printf("Usage: %s [cmdline]\n", argv[0]);
        return;
    }

    // Start the child process. 
    if( !CreateProcess( NULL,   // No module name (use command line)
        argv[1],        // Command line
        NULL,           // Process handle not inheritable
        NULL,           // Thread handle not inheritable
        FALSE,          // Set handle inheritance to FALSE
        0,              // No creation flags
        NULL,           // Use parent's environment block
        NULL,           // Use parent's starting directory 
        &si,            // Pointer to STARTUPINFO structure
        &pi )           // Pointer to PROCESS_INFORMATION structure
    ) 
    {
        printf( "CreateProcess failed (%d).\n", GetLastError() );
        return;
    }

    // Wait until child process exits.
    WaitForSingleObject( pi.hProcess, INFINITE );

    // Close process and thread handles. 
    CloseHandle( pi.hProcess );
    CloseHandle( pi.hThread );
}
 
Aleksey Vyazmikin:

Совсем не разбираюсь в dll, а очень надо решить подобную задачу.

вы вначале сделайте то что хотите без длл, потом вкручивайте в длл.

один из вариантов искать нужный процесс по имени образа через командную строку такого вида: tasklist /FI "imagename eq terminal64.exe" > d:\1.txt

зеленым выделено имя нужного процесса, синим имя файла куда будет сохранен список процессов удовлетворяющих фильтру

 
Alexey Volchanskiy:

Уже не нужно dll, недавно метаквоты ввели поддержку WinAPI, см. папку \MQL5\Include\WinAPI

Конкретно, в файле \MQL5\Include\WinAPI\winuser.mqh видим две unicode функции 

Хм... Век живи - век учись, не знал...

Буду знать.

 
Georgiy Merts:

Хм... Век живи - век учись, не знал...

Буду знать.

Там не все включено, но основное есть, больше не надо думать, что такое LPCWSTR и как его засунуть в MQL :))

 
Alexey Volchanskiy:

Вам нужно запустить команду ping с параметрами. Подключаем файл \MQL5\Include\WinAPI\processthreadsapi.mqh, в нем портирована команда для запуска любых процессов (программ)

За примерами ее использование лезем в гуглу

Вот неплохой примерчик, а можно на сайте поискать

Спасибо огромное за уделенное проблеме время!

По запуску в теории понятно больше, хотя куча флагов так и остается под вопросом.

А как всё же быть с поиском окна, в котом должна была начать работу программа, не подскажите?

 
TheXpert:

вы вначале сделайте то что хотите без длл, потом вкручивайте в длл.

один из вариантов искать нужный процесс по имени образа через командную строку такого вида: tasklist /FI "imagename eq terminal64.exe" > d:\1.txt

зеленым выделено имя нужного процесса, синим имя файла куда будет сохранен список процессов удовлетворяющих фильтру

Интересная идея - может сработать, спасибо!

А для запуска этой команды из терминала MT5 нужен же CMD.exe? Т.е. если я ищу процесс в cmd, то надо будет как то читать сразу файл и проверять в нем два процесс получается... а потом тереть файл, а тереть через "del"?

 
Aleksey Vyazmikin:

А для запуска этой команды из терминала MT5 нужен же CMD.exe? Т.е. если я ищу процесс в cmd, то надо будет как то читать сразу файл и проверять в нем два процесс получается... а потом тереть файл, а тереть через "del"?

запускаете эту команду с помощью shellexecutew

затем ждете чтобы появился файл и его можно было открыть с эксклюзивными правами (т.е. ждете пока команда закончит писать в файл)

дальше дело техники

 
Alexey Volchanskiy:

Уже не нужно dll, недавно метаквоты ввели поддержку WinAPI, см. папку \MQL5\Include\WinAPI

Конкретно, в файле \MQL5\Include\WinAPI\winuser.mqh видим две unicode функции

И шо таки серьёзно виндовс апи теперь native для mql безо всяких длл? Наконец-то настал этот светлый день.
Причина обращения: