WinAPI -> MQL5 x64 - страница 2

 
Vladimir Karputov:

Работает!


Теперь другой вопрос: как засунуть во входной параметр переменную среды %USERNAME% ? Вариант

не проходит

мало того что не проходит, так это ещё и неправильно :-)

%USERNAME% не имеет отношения к каталогам.  Они могут иметь несвязанные имена

за "домашний каталог" отвечают %HOMEDRIVE% %HOMEPATH% , за данные приложений %APPDATA% %LOCALAPPDATA%

PS/ (сам себя не похвалишь, как оплёванный ходишь). Вот отчасти чтобы не исполнять такие "танцы с бубнами"  воткнул в 4-ку tcl.

if (tcl.Eval("file mkdir [ file join $env(HOMEDRIVE) $env(HOMEPATH) Desktop Mql5 ] ]")!=TCL_OK) {

   Print("Error mkdir :"+tcl.StringResult());
}

доотлаживаю в 4-ке, портирую на 5-ку. Там в принципе только размеры указателей отличаются

 
Maxim Kuznetsov:

мало того что не проходит, так это ещё и неправильно :-)

%USERNAME% не имеет отношения к каталогам.  Они могут иметь несвязанные имена

за "домашний каталог" отвечают %HOMEDRIVE% %HOMEPATH% , за данные приложений %APPDATA% %LOCALAPPDATA%

PS/ (сам себя не похвалишь, как оплёванный ходишь). Вот отчасти чтобы не исполнять такие "танцы с бубнами"  воткнул в 4-ку tcl.

if (tcl.Eval("file mkdir [ file join $env(HOMEDRIVE) $env(HOMEPATH) Desktop Mql5 ] ]")!=TCL_OK) {

   Print("Error mkdir :"+tcl.StringResult());
}

доотлаживаю в 4-ке, портирую на 5-ку. Там в принципе только размеры указателей отличаются

Про %USERNAME% это был попутный вопрос. Сейчас главное - это правильно написать создание папки  

 
Vladimir Karputov:

Про %USERNAME% это был попутный вопрос. Сейчас главное - это правильно написать создание папки  

про п 10 - "ненужный параметр" объявить как long и приравнять к 0. получится "Си-шный" NULL :-)


 
Сергей Таболин:

Всё работает.

Папка создаётся )))

А какая у Вас операционная система? У меня

//+------------------------------------------------------------------+
//|                                                       WinAPI.mq5 |
//|                              Copyright © 2018, Vladimir Karputov |
//|                                           http://wmua.ru/slesar/ |
//+------------------------------------------------------------------+
#property copyright "Copyright © 2018, Vladimir Karputov"
#property link      "http://wmua.ru/slesar/"
#property version   "1.002"
#property script_show_inputs
//--- input parameters
string   PathName="C:\\Users\\barab\\Desktop\\Mql5";      // PathName

#import "kernel32.dll"
int      GetLastError();
bool     CreateDirectoryW(char  &lpPathName[],long null);
#import
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   char arr_path[];
   StringToCharArray(PathName,arr_path/*,0,WHOLE_ARRAY,CP_UTF8*/);

   long pointer=0;
   if(!CreateDirectoryW(arr_path,0))
      PrintFormat("Failed CreateDirectoryW (\"%s\") with error: %x",PathName,kernel32::GetLastError());
  }
//+------------------------------------------------------------------+

на

2018.05.29 09:05:44.100 Terminal        MetaTrader 5 x64 build 1816 started (MetaQuotes Software Corp.)
2018.05.29 09:05:44.103 Terminal        Windows 10 (build 17134) x64, IE 11, UAC, Intel Core i3-3120M  @ 2.50GHz, Memory: 4084 / 8077 Mb, Disk: 296 / 464 Gb, GMT+2
2018.05.29 09:05:44.103 Terminal        C:\Users\barab\AppData\Roaming\MetaQuotes\Terminal\615A3F675AAC98BF8B83CB6BEF884AE6

не работает

 
Vladimir Karputov:

А какая у Вас операционная система? У меня

на

не работает

А зачем вы wchar переделали ?

тут уж одно из двух, или string и CreateDirectoryW или char[] и просто CreateDirectory

 
Vladimir Karputov:

Здесь подсказали, что при вызове dll из MQL5 вместо string переменной нужно передавать массив char.

Но если делаю так:

получаю ошибку

ERROR_ACCESS_DENIED5 (0x5)

Access is denied.

Если переделывать в массив, то нужно использовать массив wchar, а не char. В этом случае нужна функция StringToShortArray. Хотя string - это и есть массив wchar. Разве что с типом доступа, не позволяющим его модификацию.

 
Maxim Kuznetsov:

А зачем вы wchar переделали ?

тут уж одно из двух, или string и CreateDirectoryW или char[] и просто CreateDirectory

Ihor Herasko:

Если переделывать в массив, то нужно использовать массив wchar, а не char. В этом случае нужна функция StringToShortArray. Хотя string - это и есть массив wchar. Разве что с типом доступа, не позволяющим его модификацию.

Переделал в char, так как подсказали.

А вот если делать "CreateDirectory" то такой функции нет:

2018.05.29 09:57:23.871 WinAPI (GBPUSD,H1)      Cannot find 'CreateDirectory' in 'kernel32.dll'
 
Vladimir Karputov:

Переделал в char, так как подсказали.

А вот если делать "CreateDirectory" то такой функции нет:

CreateDirectoryA. Только для нее нужен массив char.

 
Vladimir Karputov:

Из описания  CreateDirectory следует, что второй параметр (опциональный) нужно передавать как NULL (не MQL5 NULL, а c++ NULL)

чтобы это соответствовало c++ NULL.

CreateDirectoryW(char  &lpPathName[],long &null);

1) Тут точно нужна ссылка? Как по мне, просто 0 передать по значению и все.

2) Вы используете Unicode версию CreateDirectory, зачем передавать массив чаров? Возможно проще передавать string из MQL по ссылке.

 

Sergey Dzyublik:
Тут точно нужна ссылка?

CreateDirectoryW(char  &lpPathName[],long &null);

Как по мне, просто 0 передать по значению и все.

Ну я пробовал и ссылку и просто ноль. Не работает в связке с массивом char.