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

 
Vladimir Karputov:

А где там про размер почитать?

Там, не знаю. ищите что-нибудь на тему "LLP64 data model", например здесь https://en.wikipedia.org/wiki/64-bit_computing. Сам C/C++ каких-то конкретных размеров не задаёт http://en.cppreference.com/w/cpp/language/types

 
Vladimir Karputov:

А где там про размер почитать?

простейшее действие - напечатать размер типов из С 64x и соотнести с MQL :-) Как ни странно это быстрее чем погрязнуть в документации

размерности должны сходится, иначе вызов DLL мягко говоря гадит
 
Maxim Kuznetsov:

простейшее действие - напечатать размер типов из С 64x ***

Вы сейчас про MQL5?

 
Vladimir Karputov:

Вы сейчас про MQL5?

да, конечно.. я же не зря сказал про 64 :-)

просто распечатать sizeof(typeName) там и там..один раз из MT5 другой - из С собранного в 64 бита.

кол-во байт должно сходится, чтобы не вызывать системных проблем. Для общепринятых типов ещё можно составить таблицу, но если какая-нить библиотека C/C++ использует например целый скаляр mps_t, то проще напечатать его размер чем перекопать все исходники выясняя от кого он произошёл

 
Maxim Kuznetsov:

*** другой - из С собранного в 64 бита.

***

Меня смущают эти строки. Уточняю во-второй раз: Вы точно про MQL5?

 
Vladimir Karputov:

Меня смущают эти строки. Уточняю во-второй раз: Вы точно про MQL5?

Вы на чём-нибудь программировали кроме MQL ? понятие ABI что-нибудь говорит ??

потому что элементарные вещи - тип названный "int" или "supertype" в MQL и одноимённые типы в документации MSDN они имеют полное право быть разными. Чтобы сработала DLL вы должны передавать равное кол-во байтов. Ровно то что ожидается DLL-кой.
MT5 работает в 64 бита. Скомпилите в те-же 64 бита С-шник и напечайте размера типов требуемых DLL - вы узнаете сколько  байт надо передавать/принимать в аргументах.

update: и точно также со структурами - взяли С-шную структуру из документации, описали её в MQL. И первое что надо сделать - проверить размеры. Они должны быть идентичны
 
Maxim Kuznetsov:

Вы на чём-нибудь программировали кроме MQL ? понятие ABI что-нибудь говорит ??

потому что элементарные вещи - тип названный "int" или "supertype" в MQL и одноимённые типы в документации MSDN они имеют полное право быть разными. Чтобы сработала DLL вы должны передавать равное кол-во байтов. Ровно то что ожидается DLL-кой.
MT5 работает в 64 бита. Скомпилите в те-же 64 бита С-шник и напечайте размера типов требуемых DLL - вы узнаете сколько  байт надо передавать/принимать в аргументах.

Нет, ничего лишнего, кроме MQL5 на компьютере не стоит.


А вот, то что я передаю неправильное количество байт в 

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

я понимаю. Вот только до сих пор не ясно, сколько же нужно передавать.

 
Maxim Kuznetsov:

Вы на чём-нибудь программировали кроме MQL ? понятие ABI что-нибудь говорит ??

потому что элементарные вещи - тип названный "int" или "supertype" в MQL и одноимённые типы в документации MSDN они имеют полное право быть разными. Чтобы сработала DLL вы должны передавать равное кол-во байтов. Ровно то что ожидается DLL-кой.
MT5 работает в 64 бита. Скомпилите в те-же 64 бита С-шник и напечайте размера типов требуемых DLL - вы узнаете сколько  байт надо передавать/принимать в аргументах.

update: и точно также со структурами - взяли С-шную структуру из документации, описали её в MQL. И первое что надо сделать - проверить размеры. Они должны быть идентичны

Что нужно минимально поставить, чтобы проверять размеры (C, C++, ...) и главное КАК там проверить?

 

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


что выбрать?

Бесплатные программы и службы для разработчиков | Visual Studio
Бесплатные программы и службы для разработчиков | Visual Studio
  • 2018.04.04
  • Linda Webster
  • www.visualstudio.com
Полнофункциональная интегрированная среда разработки для создания некорпоративных приложений для Windows, Android и iOS, а также современных веб-приложений и облачных служб...
 
Сергей Таболин:

Операционку указывал тут

Я же несколько раз уточнил - нужно передавать массив char. Вы же используете string. Нужно чтобы работало с массивом char

//+------------------------------------------------------------------+
//|                                                       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());
  }