Не могу запустить WriteFile метод из kernel32.dll

 

Импорт делаю так

#define FILE_WRITE_DATA         0x0002
#define FILE_APPEND_DATA        0x0004
#define OPEN_ALWAYS             4
#define FILE_ATTRIBUTE_NORMAL   0x00000080 
#define GENERIC_WRITE           0x40000000
#define FILE_SHARE_WRITE_       0x00000002

#import "kernel32.dll"
   int CopyFileA(uchar & [],uchar & [],int);
   int CreateFileW( string lpFileName, uint dwDesiredAccess, uint dwShareMode, uint lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, uint hTemplateFile );
   bool WriteFile( int hFile, uchar& lpData[], int nNumberOfBytesToWrite, int& lpNumberOfBytesWritten, int lpOverlapped );
   bool DeleteFileW(string path);
   int CloseHandle( int hFile );
#import

Запускаю так

uchar file_data[];
   StringToCharArray(data, file_data, 0, StringLen(data));
   int hFile = CreateFileW(file_path, FILE_WRITE_DATA|FILE_APPEND_DATA, 0, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0 );
   if (hFile != INVALID_HANDLE){
      int p_number;
      bool res = WriteFile(hFile, file_data, ArraySize(file_data), p_number, 0 );
      CloseHandle(hFile);
      Print(res);
      Print(p_number);
      if (!res || p_number <=0)
         return false;
      else
         return true;    
   } else{
      return false;  
   }  

Этот код срабатывает на мт4 на всех платформах, на мт5 только под Windows 7. На остальных виндах не работает, выдает:

Мне нужно чтобы работало на всех платформах и на мт5 тоже. Помогите разобраться.

 
Dmitri Custurov:

Импорт делаю так

Запускаю так

Этот код срабатывает на мт4 на всех платформах, на мт5 только под Windows 7. На остальных виндах не работает, выдает:

Мне нужно чтобы работало на всех платформах и на мт5 тоже. Помогите разобраться.

CreateFile возвращает не int, а HANDLE, в 64-битном приложении - это, по местному, ulong
 
Vladimir Simakov:
CreateFile возвращает не int, а HANDLE, в 64-битном приложении - это, по местному, ulong

Спасибо за ответ, но, не помогло.

Теперь код выглядит так


#import "kernel32.dll"
   ulong CreateFileW( string lpFileName, uint dwDesiredAccess, uint dwShareMode, uint lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, uint hTemplateFile );
   bool WriteFile( ulong hFile, uchar& lpData[], int nNumberOfBytesToWrite, int& lpNumberOfBytesWritten, int lpOverlapped );
   int CloseHandle( ulong hFile );
#import

И так

ulong hFile = CreateFileW(file_path, GENERIC_WRITE, 0, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0 );
   if (hFile != INVALID_HANDLE){
      int p_number;
      bool res = WriteFile(hFile, file_data, ArraySize(file_data), p_number, 0 );
      CloseHandle(hFile);
      Print(res);
      Print(p_number);
      if (!res || p_number <=0)
         return false;
      else
         return true;    
   } else{
      return false;  
   }  
 
И больше всего удивляет что в мт4 работает на всех платформах.
 

Используйте лучше штатные #include <winapi/fileapi.mqh>

Прототип функции неправильный у вас, исключительно под 32 битные операционки.

Должен быть:

int    WriteFile(HANDLE file,const ushort &buffer[],uint number_of_bytes_to_write,uint &number_of_bytes_written,OVERLAPPED &overlapped);
int    WriteFile(HANDLE file,const ushort &buffer[],uint number_of_bytes_to_write,uint &number_of_bytes_written,PVOID overlapped);

посмотрите детали в fileapi.mqh

 
Renat Fatkhullin:

Используйте лучше штатные #include <winapi/fileapi.mqh>

Прототип функции неправильный у вас, исключительно под 32 битные операционки.

Должен быть:

посмотрите детали в fileapi.mqh

Огромное спасибо, сработало.

 

Конечный код если кому нужно будет

#import "kernel32.dll"
   long CreateFileW( string lpFileName, uint dwDesiredAccess, uint dwShareMode, uint lpSecurityAttributes, uint dwCreationDisposition, uint dwFlagsAndAttributes, uint hTemplateFile );
   //bool WriteFile( ulong hFile, uchar& lpData[], int nNumberOfBytesToWrite, int& lpNumberOfBytesWritten, int lpOverlapped );
   int  WriteFile(long file,const uchar &buffer[],uint number_of_bytes_to_write,uint &number_of_bytes_written,long overlapped);
   int CloseHandle( long hFile );
#import
long hFile = CreateFileW(file_path, GENERIC_WRITE, 0, 0, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, 0 );
   if (hFile != INVALID_HANDLE){
      int p_number;
      int res = WriteFile(hFile, file_data, ArraySize(file_data), p_number, 0 );
      CloseHandle(hFile);
      Print(res);
      Print(p_number);
      if (!res || p_number <=0)
         return false;
      else
         return true;    
   } else{
      return false;  
   }  
Причина обращения: