Прошу помощь, нуждаюсь в коде для функций по запуску программы из 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);
Уже не нужно dll, недавно метаквоты ввели поддержку WinAPI, см. папку \MQL5\Include\WinAPI
Конкретно, в файле \MQL5\Include\WinAPI\winuser.mqh видим две unicode функции
Вижу Вы в этом деле разбираетесь! Может предметно поможете, а то для меня темный лес, даже не представляю что в эти функции передавать и что они возвратят, в хэлпе ничего не описано :(
К примеру на примере команды ping 127.01.01.01Вижу Вы в этом деле разбираетесь! Может предметно поможете, а то для меня темный лес, даже не представляю что в эти функции передавать и что они возвратят, в хэлпе ничего не описано :(
К примеру на примере команды 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 ); }
Совсем не разбираюсь в dll, а очень надо решить подобную задачу.
вы вначале сделайте то что хотите без длл, потом вкручивайте в длл.
один из вариантов искать нужный процесс по имени образа через командную строку такого вида: tasklist /FI "imagename eq terminal64.exe" > d:\1.txt
зеленым выделено имя нужного процесса, синим имя файла куда будет сохранен список процессов удовлетворяющих фильтру
Уже не нужно dll, недавно метаквоты ввели поддержку WinAPI, см. папку \MQL5\Include\WinAPI
Конкретно, в файле \MQL5\Include\WinAPI\winuser.mqh видим две unicode функции
Хм... Век живи - век учись, не знал...
Буду знать.
Хм... Век живи - век учись, не знал...
Буду знать.
Там не все включено, но основное есть, больше не надо думать, что такое LPCWSTR и как его засунуть в MQL :))
Вам нужно запустить команду ping с параметрами. Подключаем файл \MQL5\Include\WinAPI\processthreadsapi.mqh, в нем портирована команда для запуска любых процессов (программ)
За примерами ее использование лезем в гуглу
Вот неплохой примерчик, а можно на сайте поискать
Спасибо огромное за уделенное проблеме время!
По запуску в теории понятно больше, хотя куча флагов так и остается под вопросом.
А как всё же быть с поиском окна, в котом должна была начать работу программа, не подскажите?
вы вначале сделайте то что хотите без длл, потом вкручивайте в длл.
один из вариантов искать нужный процесс по имени образа через командную строку такого вида: tasklist /FI "imagename eq terminal64.exe" > d:\1.txt
зеленым выделено имя нужного процесса, синим имя файла куда будет сохранен список процессов удовлетворяющих фильтру
Интересная идея - может сработать, спасибо!
А для запуска этой команды из терминала MT5 нужен же CMD.exe? Т.е. если я ищу процесс в cmd, то надо будет как то читать сразу файл и проверять в нем два процесс получается... а потом тереть файл, а тереть через "del"?
А для запуска этой команды из терминала MT5 нужен же CMD.exe? Т.е. если я ищу процесс в cmd, то надо будет как то читать сразу файл и проверять в нем два процесс получается... а потом тереть файл, а тереть через "del"?
запускаете эту команду с помощью shellexecutew
затем ждете чтобы появился файл и его можно было открыть с эксклюзивными правами (т.е. ждете пока команда закончит писать в файл)
дальше дело техники
Уже не нужно dll, недавно метаквоты ввели поддержку WinAPI, см. папку \MQL5\Include\WinAPI
Конкретно, в файле \MQL5\Include\WinAPI\winuser.mqh видим две unicode функции
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Прошу помощь, нуждаюсь в коде для функций по запуску программы из MT5 через dll и мониторинга окончания её работы.
В функцию нужно подавать строку на исполнение:
После подачи строки мониторить через секунду появления программы в режиме CMD - обычное окно типа DOS, где бегут строчки.
Но не ясно, как отследить что окно такое имеется и работа программы ещё не завершена. Нужна подобная функция, которая сообщит о статусе программы - имеется окно или нет.
bool WorkGo(){}
У окна не видно заголовка - просто как обычно путь к файлу cmd.exe .
Возможно эта функция может быть полезной от Microsoft
Но как её заставить работать - не понимаю.
Совсем не разбираюсь в dll, а очень надо решить подобную задачу.