Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Нужна мобильная версия MetaTrader 5? Скачивай и торгуй!
Vladislav Andruschenko
83194
Vladislav Andruschenko 2014.02.11 18:26 

Всем привет, с новым билдом слышал - нельзя передавать строки в длл

Есть набор функций записи в файл:

#import "KERNEL32.dll"
   int _lopen  (string path, int of);
   int _lcreat (string path, int attrib);
   int _llseek (int handle, int offset, int origin);
   int _lread  (int handle, string buffer, int bytes);
   int _lwrite (int handle, string buffer, int bytes);
   int _lclose (int handle);
   
#import

Есть функция непосредственнл:

#import "ntdll.dll"
 int RtlGetLastWin32Error();
 int RtlSetLastWin32Error (int dwErrCode);
#import

void WriteFile (string path, string buffer) 
  {
    int count=StringLen (buffer); 
    int result;
    int handle=_lopen (path,3);
    if(handle<0) 
      {
        handle=_lcreat (path,0);
           Print("_lcreat PathName=", path, "   Create result = ", handle, ",  GetLastError()=", RtlGetLastWin32Error());
  
        if(handle<0) 
          {
            Print ("Ошибка создания файла ",path);
            return;
          }
        result=_lclose (handle);
     }
    handle=_lopen (path,3);               
    if(handle<0) 
      {
        Print("Ошибка открытия файла ",path); 
        return;
      }
    result=_llseek (handle,0,0);          
    if(result<0) 
      {
        Print("Ошибка установки указателя"); 
        return;
      }
    result=_lwrite (handle,buffer,count); 
    if(result<0)  
        Print(result+" Ошибка записи в файл ",path," ",count," байт");
    result=_lclose (handle);              
    if(result<0)  
        Print("Ошибка закрытия файла ",path);
  }
  

в Новом билде эта конструкция естественно не работает.

Кто-нибудь уже нашел способ решения?

Vadim Zhunko
5221
Vadim Zhunko 2014.02.11 18:34  
Vladon:

Всем привет, с новым билдом слышал - нельзя передавать строки в длл

Есть набор функций записи в файл:

#import "KERNEL32.dll"
   int _lopen  (string path, int of);
   int _lcreat (string path, int attrib);
   int _llseek (int handle, int offset, int origin);
   int _lread  (int handle, string buffer, int bytes);
   int _lwrite (int handle, string buffer, int bytes);
   int _lclose (int handle);
#import

Эти функции оставлены для совместимости c 16 битными приложениями!

Пора бы уже повзрослеть... :-)) до ReadFile() и WriteFile().

Вот есть библиотека. Замените там постфиксы с A на W. Будет работать.

Vladislav Andruschenko
83194
Vladislav Andruschenko 2014.02.11 18:43  
Спасибо. ReadFile() и WriteFile().пробовал когда-то, но почему то они мне не подошли.
Комбинатор
15652
Комбинатор 2014.02.11 19:42  
Vladon:

Кто-нибудь уже нашел способ решения?

Я уже минимум два раза писал с примерами. Если у функции нет W аналога, конвертить в uchar и передавать массив.

Про ReadFile WriteFile полностью согласен.


Vadim Zhunko
5221
Vadim Zhunko 2014.02.11 19:43  

Vladon:
Спасибо. ReadFile() и WriteFile().пробовал когда-то, но почему то они мне не подошли.
Катался на дрезине. Подарили вертолёт. Почему-то он мне не подошёл.

Нет привычного стука колёс?

Vladislav Andruschenko
83194
Vladislav Andruschenko 2014.02.11 20:35  
ладно, ладно, я понял смысл ответов. ок
TheXpert:
Я уже минимум два раза писал с примерами. Если у функции нет W аналога, конвертить в uchar и передавать массив.

Про ReadFile WriteFile полностью согласен.


спасибо про W это я знаю,

про свои длл тоже знаю,

я про функции которые была когда-то востребованы из-за легкости кода.

Спасибо учел все ответы и свои геморные вопросы - :-) буду заниматься.

Комбинатор
15652
Комбинатор 2014.02.11 20:47  
Vladon:

про свои длл тоже знаю,

? Конвертить в uchar в MQL коде и вместо string в импорте uchar[]

Или таки пример искать?

Yuriy Zaytsev
11664
Yuriy Zaytsev 2014.02.12 05:47  
Zhunko:

Катался на дрезине. Подарили вертолёт. Почему-то он мне не подошёл.

Нет привычного стука колёс?


:)))) +++


Вадим - привет, развеселил!!! спасибо

Yuriy Zaytsev
11664
Yuriy Zaytsev 2014.02.12 05:47  
Vladon:

Всем привет, с новым билдом слышал - нельзя передавать строки в длл

можно...
Ilyas
1185
Ilyas 2014.02.12 10:35  
Так разрешено передавать массивы строк, теперь это будет возможно и в 5ке.

Но следует учесть, что формат строки изменился.

Для 32 бит:
struct MqlString
  {
   int        buffer_size;
   wchar_t   *buffer;
   int        reserved;
  };
Для 64 бит:
struct MqlString
  {
   int        buffer_size;
   wchar_t   *buffer;
  };
Vadim Zhunko
5221
Vadim Zhunko 2014.02.12 10:54  

mql5:
Так разрешено передавать массивы строк, теперь это будет возможно и в 5ке.

Но следует учесть, что формат строки изменился.

Для 32 бит:

struct MqlString
  {
   int        buffer_size;
   wchar_t   *buffer;
   int        reserved;
  };
Для 64 бит:
struct MqlString
  {
   int        buffer_size;
   wchar_t   *buffer;
  };

Спасибо! Про 64 не знал. Надо бы это в справку внести.

Теперь так:

  typedef struct _MQLSTRA
   {
    int   nLength;
    LPSTR szString;
   } MQLSTRA, *PMQLSTRA;

  typedef struct _MQLSTRW
   {
    int    nLength;
    LPWSTR szString;
    #if !defined(WIN64) && !defined(_WIN64)
     int   nReserved;
    #endif
   } MQLSTRW, *PMQLSTRW;

  #if defined(UNICODE) || defined(_UNICODE)
   typedef MQLSTRW   MQLSTR, *PMQLSTR;
  #else
   typedef MQLSTRA   MQLSTR, *PMQLSTR;
  #endif



/ /12
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий