Acces violation ShellExecuteW and FileOpen

 

Вот такой прием не работает, рухнет программа
Выполняется скрипт на МТ5
Операционная Windows 10 Pro 64 Bit Build 21H2

#include <WinUser32.mqh>
#define SW_SHOW  5
#import "shell32.dll"
int ShellExecuteW(int hWnd,int lpVerb,string lpFile,int lpParameters,int lpDirectory,int nCmdShow);
#import

void OnStart() {
   if(TerminalInfoInteger(TERMINAL_DLLS_ALLOWED)==false) {
      Alert("DLL call is not allowed. Script cannot run.");
      return;
   } 
   
   int handle = FileOpen("test.html", FILE_TXT|FILE_WRITE);
   FileClose(handle);
   
   string fileNAME=TerminalInfoString(TERMINAL_PATH)+"\\MQL5\\Files\\test.html"; 
   
   ShellExecuteW(NULL,NULL,fileNAME,NULL,NULL,SW_SHOW); // !!!!!!!!!!!!!!!
}




если вызывается с отдельного скрипта, то всё нормально

Этот же самый код на МТ4 работает без проблем



Ошибка в терминале?
Баги больше нельзя в сервисдеск отправлять?
Не работает там кнопка

Документация по MQL5: Проверка состояния / TerminalInfoInteger
Документация по MQL5: Проверка состояния / TerminalInfoInteger
  • www.mql5.com
TerminalInfoInteger - Проверка состояния - Справочник MQL5 - Справочник по языку алгоритмического/автоматического трейдинга для MetaTrader 5
 
wladimir:

Этот же самый код на МТ4 работает без проблем



Ошибка в терминале?
Баги больше нельзя в сервисдеск отправлять?
Не работает там кнопка

long hWnd,
 
Указатели должны быть 64-хбитными.
Передача строк происходит через указатели.

 
Mikhail Dovbakh #:
к сожалению не помогло
 
Aliaksandr Hryshyn #:
Указатели должны быть 64-хбитными.
Передача строк происходит через указатели.

подскажите как подправить
 
HINSTANCE ShellExecuteW(
  [in, optional] HWND    hwnd,
  [in, optional] LPCWSTR lpOperation,
  [in]           LPCWSTR lpFile,
  [in, optional] LPCWSTR lpParameters,
  [in, optional] LPCWSTR lpDirectory,
  [in]           INT     nShowCmd
);

Взято отсюда:

https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shellexecutew

HWND  это long

LPCWSTR это строка, а точнее, указатель на область в памяти на последовательность юникод-символов. Если заменять, то на long.

Работает:

#define SW_SHOW  5
#import "shell32.dll"
int ShellExecuteW(long hwnd,string Operation,string File,string Parameters,string Directory,int ShowCmd);
#import

void OnStart()
  {
   string fileNAME=TerminalInfoString(TERMINAL_PATH)+"\\MQL5\\Files\\test.html";

   Print(ShellExecuteW(NULL,NULL,fileNAME,NULL,NULL,SW_SHOW));
   Print(ShellExecuteW(NULL,NULL,"calc",NULL,NULL,SW_SHOW));
  }

Результат:

2022.03.14 16:17:08.700 1 (EURUSD,M1)   2
2022.03.14 16:17:08.711 1 (EURUSD,M1)   42

2 -это  ERROR_FILE_NOT_FOUND, у меня такого файла нету

42 - больше 32, значит всё хорошо, и запустился калькулятор

 
Aliaksandr Hryshyn #:

Взято отсюда:

https://docs.microsoft.com/en-us/windows/win32/api/shellapi/nf-shellapi-shellexecutew

HWND  это long

LPCWSTR это строка, а точнее, указатель на область в памяти на последовательность юникод-символов. Если заменять, то на long.

Работает:

Результат:

2 -это  ERROR_FILE_NOT_FOUND, у меня такого файла нету

42 - больше 32, значит всё хорошо, и запустился калькулятор

Спасибо огромное. Все заработало