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

 
Такими темпами похоже dll скоро в маркете разрешат, если уже даже ярые их противники вовсю их используют и даже собираются грузить Visual Studio
 
Maxim Kuznetsov:
успехов старшим товарищам :-)

Все правило было сказано. Если вы хотите чтобы работало всегда - нужно использовать ushort, а если вы хотите разбираться почему вдруг со string перестало работать (то что работало еще вчера) - то можно и string

 
Vladimir Karputov:

Страница Visual Studio - три варианта:


что выбрать?

VS Community 2017 конечно

 
A100:
Такими темпами похоже dll скоро в маркете разрешат, если уже ярые их противники вовсю их используют и даже собираются грузить Visual Studio

Еретики среди модераторов! На костерррр!!!!!!!

 

Существует два варианта функции CreateDirectory:  CreateDirectoryA ( ANSI ) и CreateDirectoryW ( Unicode ).

Правильно определяются они так:

#import "Kernel32.dll"
   BOOL CreateDirectoryA( char& lpPathName[], SECURITY_ATTRIBUTES& lpSecurityAttributes );
   BOOL CreateDirectoryW( short& lpPathName[], SECURITY_ATTRIBUTES& lpSecurityAttributes );
#import

В функцию CreateDirectoryW вместо массива short можно подавать string. Это предусмотрено разработчиками MQL.

Вместо структуры SECURITY_ATTRIBUTES можно подавать 0. Для этого второй аргумент функции определим как PVOID.

Кроме этого нужно учесть, что папка пользователя необязательно находится на диске C.

Исходя из всего этого получаем рабочий код:

#define _WIN64  // Только для 64-разрядного терминала!

#include <WinDef.mqh>

#import "Kernel32.dll"
   BOOL CreateDirectoryW( string lpPathName, PVOID lpSecurityAttributes );
   DWORD GetEnvironmentVariableW( string lpName, ushort& lpBuffer[], DWORD nSize );
#import

ushort buffer[250];

void OnStart()
{
   GetEnvironmentVariableW( "USERPROFILE", buffer, 250 );
   
   string userPath = ShortArrayToString( buffer );
   string newDir = userPath + "\\Desktop\\Mql5";

   CreateDirectoryW( newDir, 0 );
}
В файле WinDef.mqh определены типы наиболее часто использующиеся в WinAPI.
Файлы:
WinDef.mqh  2 kb
 

После совещания с высокими товарищами выкристаллизовалось такое решение: 

- если WinAPI функция содержит в конце своего имени W, значит она работает с юникодными строками. Эти строки следует передавать в виде переменной string.

Исходя из этого создание папки выглядит так:

//+------------------------------------------------------------------+
//|                                                       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.004"
#property script_show_inputs
//--- input parameters
string   PathName="C:\\Mql5";      // PathName

#import "kernel32.dll"
int      GetLastError();
bool     CreateDirectoryW(string  &lpPathName,long null=0);

#import
//+------------------------------------------------------------------+
//| Script program start function                                    |
//+------------------------------------------------------------------+
void OnStart()
  {
   if(!CreateDirectoryW(PathName))
      PrintFormat("Failed CreateDirectoryW (\"%s\") with error: %x",PathName,kernel32::GetLastError());
  }
//+------------------------------------------------------------------+


Окончание работы функции с ошибкой не всегда плохо, так как ошибка "b7" это означает

ERROR_ALREADY_EXISTS183 (0xB7)

Cannot create a file when that file already exists.

, что такой файл уже есть

Файлы:
WinAPI.mq5  3 kb
 
Vladimir Karputov:

После совещания с высокими товарищами выкристаллизовалось такое решение: 

- если WinAPI функция содержит в конце своего имени W, значит она работает с юникодными строками. Эти строки следует передавать в виде переменной string.

Исходя из этого создание папки выглядит так:


Окончание работы функции с ошибкой не всегда плохо, так как ошибка "b7" это означает

ERROR_ALREADY_EXISTS183 (0xB7)

Cannot create a file when that file already exists.

, что такой файл уже есть

а зачем вам форум ?  обращайтесь сразу к высоким товарищам :-)

вам  про сие 3 страницы твердят на разные лады...но видимо недостаточно высоки..:-)

 

Появилась идея собрать применяемые мной вызовы WinAPI в небольшую библиотеку.


Вот были такие вызовы :

#import "kernel32.dll"
int      GetLastError();
int      CopyFileW(string lpExistingFileName,string lpNewFileName,bool bFailIfExists);
long     FindFirstFileW(string lpFileName,WIN32_FIND_DATA  &lpFindFileData);
int      FindNextFileW(long FindFile,WIN32_FIND_DATA &lpFindFileData);
int      FindClose(long hFindFile);
int      FindNextFileW(int FindFile,WIN32_FIND_DATA &lpFindFileData);
int      FindClose(int hFindFile);
#import
Причина обращения: