Запись файлов KERNEL32.dll _lcreat _lwrite _lread

 

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

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

#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);
  }
  

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

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

 
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. Будет работать.

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

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

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

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


 

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

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

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

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


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

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

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

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

 
Vladon:

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

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

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

 
Zhunko:

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

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


:)))) +++


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

 
Vladon:

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

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

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

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

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



Причина обращения: