windows script host error при выполнении ShellExecuteW

 

День добрый!

При выполнении этого кода больше 3 раз 

//+------------------------------------------------------------------+
//|                                            ShellExecuteCatch.mq5 |
//|                        Copyright 2020, MetaQuotes Software Corp. |
//|                                             https://www.mql5.com |
//+------------------------------------------------------------------+
#property copyright "Copyright 2020, MetaQuotes Software Corp."
#property link      "https://www.mql5.com"
#property version   "1.00"
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
#import "shell32.dll"
   int ShellExecuteW(int hwnd,string lpOperation,string lpFile,string lpParameters,string lpDirectory,int nShowCmd);
#import
void OnStart()
  {
//---
string file2run="";
file2run = TerminalInfoString(TERMINAL_DATA_PATH)+"\\MQL5\\Files\\1sspeechexample.vbs";
   for(int i=0;i<4;i++)
   {
      ShellExecuteW(NULL,NULL,file2run,"","",0);
  }
  }
//+------------------------------------------------------------------+


по окончанию работы MQL5 скрипта появляется окно




Сам vbs файл во вложении с измененным с .vbs на .txt расширением, иначе форум не принимает.

Скрипт отрабатывает корректно и фраза "Hello, World" произносится 4 раза, но вот это окно по окончании...

Не подскажете, как можно "отловить" это поведение, чтобы предотвратить появление всплывающего окна по окончанию скрипта?

Файлы:
 
nkaretnikov:

День добрый!

При выполнении этого кода больше 3 раз 


по окончанию работы MQL5 скрипта появляется окно




Сам vbs файл во вложении с измененным с .vbs на .txt расширением, иначе форум не принимает.

Скрипт отрабатывает корректно и фраза "Hello, World" произносится 4 раза, но вот это окно по окончании...

Не подскажете, как можно "отловить" это поведение, чтобы предотвратить появление всплывающего окна по окончанию скрипта?

Разрядность терминала?

 

высока вероятность, что виртуальная машина где исполняется вызываемый скрипт не успевает закончить свою работу корректно, 

попробуйте сначала паузу Sleep(10 000) добавить в цикл, если поможет уменьшайте 10 000 до приемлемого значения

у меня такие "чудеса" при первом запуске .dll под .Net были, подобрал опытным путем паузу, теперь все ОК

 
Igor Makanu:

высока вероятность, что виртуальная машина где исполняется вызываемый скрипт не успевает закончить свою работу корректно, 

попробуйте сначала паузу Sleep(10 000) добавить в цикл, если поможет уменьшайте 10 000 до приемлемого значения

у меня такие "чудеса" при первом запуске .dll под .Net были, подобрал опытным путем паузу, теперь все ОК

Первым делом надо DLL Правильно вызвать. А это зависит от разрядности. Приведённый код для 32 разрядного терминала.

 
Koldun Zloy:

Разрядность терминала?

в Help\About это не указано. Как узнать разрядность терминала?

 
Igor Makanu:

высока вероятность, что виртуальная машина где исполняется вызываемый скрипт не успевает закончить свою работу корректно, 

попробуйте сначала паузу Sleep(10 000) добавить в цикл, если поможет уменьшайте 10 000 до приемлемого значения

у меня такие "чудеса" при первом запуске .dll под .Net были, подобрал опытным путем паузу, теперь все ОК

Хорошая идея! Это помогло с ошибкой при нормальном окончании скрипта. Но если принудительно выгружать скрипт из бесконечного цикла,

   for(int i=0;i>-1;i=i)
   {
      ShellExecuteW(NULL,NULL,file2run,"","",0);
      Sleep(10000);
  }

то она все равно появляется.

 

Попробуйте так:

#import "shell32.dll"
   long ShellExecuteW( long hwnd, string lpOperation, string lpFile, string lpParameters, string lpDirectory, int nShowCmd );
#import
 

https://www.hresult.info/FACILITY_ITF/0x80045006 - "The wave device is busy."

Нужно использовать WaitUntilDone - https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms723616(v=vs.85)

 
SeriousRacoon:

https://www.hresult.info/FACILITY_ITF/0x80045006 - "The wave device is busy."

Нужно использовать WaitUntilDone - https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms723616(v=vs.85)

похоже это оно самое! 

Спасибо, буду пробовать

 
SeriousRacoon:

https://www.hresult.info/FACILITY_ITF/0x80045006 - "The wave device is busy."

Нужно использовать WaitUntilDone - https://docs.microsoft.com/en-us/previous-versions/windows/desktop/ms723616(v=vs.85)

ознакомился поглубже.

Изменил немного озвучку

dim speechobject
set speechobject=createobject("sapi.spvoice")
speechobject.speak "The MQL5 + VBS = Love"
speechobject.WaitUntilDone (-1)

и все одно, при выгрузке MQL5 скрипта, появляется 80045006

Есть ощущение, что WaitUntilDone контролирует контекст самого vbs, а когда он рушится принудительно из MQL никакой WaitUntilDone уже не помогает.

Если это так, то помогла бы задержка перед выгрузкой MQL5 скрипта. Т.е. при

подождать пока ShellExecuteW наговорится

Такое реально?

 
Koldun Zloy:

Попробуйте так:

попробовал, но получил ошибку во время исполнения