файл mapp памяти запись C для чтения в mql4

#c #mql4

#c #mql4

Вопрос:

привет, ребята, я хочу прочитать файл с отображением памяти, созданный программой на C , я использую пример MSDN для создания на C файла с отображением памяти, я хочу прочитать строку в моем metatrader 4 я пишу этот код

 #property copyright "Copyright © 2005, MetaQuotes Software Corp."
#property link      "http://www.metaquotes.net/"

#property indicator_separate_window
#property indicator_minimum 0
#property indicator_buffers 1
#property indicator_color1 Blue
#define FILE_MAP_READ           4

#define BUF_SIZE 256
extern string szName = "MyFileMappingObject";
//extern string szName = "Global\dllmemfilemap";
int handle = 0;
string  Data;

#import "kernel32.dll"
int OpenFileMappingA(int dwDesiredAccess, bool bInheritHandle, string lpName);
string  MapViewOfFile(int hFileMappingObject, int dwDesiredAccess, int dwFileOffsetHigh, int dwFileOffsetLow, int dwNumberOfBytestoMap);
int CloseHandle( int handle);
int UnmapViewOfFile(string lpBaseAddress);
#import
// ------------------------------------------------------------------ 
//|                                                                  |
// ------------------------------------------------------------------ 
int start()
  {
   handle = OpenFileMappingA(FILE_MAP_READ, FALSE, szName);
   if(handle == 0)
   {
      Alert("Could not open file mapping object", GetLastError());
   }
   else
   {
   Data = MapViewOfFile(handle, FILE_MAP_READ, 0, 0, BUF_SIZE);
   Alert(Data);
   UnmapViewOfFile(Data);
   CloseHandle(handle);
   }
   return (0);
  }

// ------------------------------------------------------------------ 
//| Custom indicator initialization function                         |
// ------------------------------------------------------------------ 
int init()
  {
   return(0);
  }
  

но не открывайте OpenFileMappingA, всегда возвращайте 0, у кого-нибудь есть идеи? спасибо вообще

Ответ №1:

Вам нужно позвонить CreateFileMapping , прежде чем пытаться OpenFileMapping .

Смотрите пример здесь :

 #include <windows.h>
#include <stdio.h>
#include <conio.h>
#include <tchar.h>

#define BUF_SIZE 256
TCHAR szName[]=TEXT("Global\MyFileMappingObject");
TCHAR szMsg[]=TEXT("Message from first process.");

int _tmain()
{
   HANDLE hMapFile;
   LPCTSTR pBuf;

   hMapFile = CreateFileMapping(
                 INVALID_HANDLE_VALUE,    // use paging file
                 NULL,                    // default security
                 PAGE_READWRITE,          // read/write access
                 0,                       // maximum object size (high-order DWORD)
                 BUF_SIZE,                // maximum object size (low-order DWORD)
                 szName);                 // name of mapping object

   if (hMapFile == NULL)
   {
      _tprintf(TEXT("Could not create file mapping object (%d).n"),
             GetLastError());
      return 1;
   }
   pBuf = (LPTSTR) MapViewOfFile(hMapFile,   // handle to map object
                        FILE_MAP_ALL_ACCESS, // read/write permission
                        0,
                        0,
                        BUF_SIZE);

   if (pBuf == NULL)
   {
      _tprintf(TEXT("Could not map view of file (%d).n"),
             GetLastError());

       CloseHandle(hMapFile);

      return 1;
   }


   CopyMemory((PVOID)pBuf, szMsg, (_tcslen(szMsg) * sizeof(TCHAR)));
    _getch();

   UnmapViewOfFile(pBuf);

   CloseHandle(hMapFile);

   return 0;
}
  

Комментарии:

1. извините, я ссылаюсь на плохую ссылку, я следую только вашему примеру

2. Куда вы звонили CreateFileMapping ? Этого нет нигде в вашем примере кода.

3. у меня есть первый процесс на C , процесс тот же (тот же, который вы мне прислали), и напишите строку «Сообщение от первого процесса» правильно, потому что, если я протестирую со вторым процессом на C , все будет хорошо, но когда я пытаюсь запустить MQL4 в metatrader, всегда возвращает 0 в дескрипторе переменной o_O

4. ЭВРИКА, я должен использовать это OpenFileMappingW(FILE_MAP_READ, False, szName); а не OpenFileMappingA

Ответ №2:

строки в MQL имеют формат unicode или аналогично 2 байта wchat_t в C . Вот пример :

 #include <cstdlib>
#include <cstring>
#include <string>
char* pBufMQL;
std::wstring ss = L"Sample string";
CopyMemory((PVOID)pBufMQL, ss.c_str(), ss.size() * sizeof(wchar_t));
  

в MQL:

 handle = OpenFileMappingW( FILE_MAP_ALL_ACCESS, FALSE, szName);
if(handle == 0)
{
    Alert("Could not open file mapping object", GetLastError());
}
string Data = MapViewOfFile(handle, FILE_MAP_ALL_ACCESS, 0, 0, BUF_SIZE);
Print("Done, size: ", StringLen(Data), "-", Data);
  

ps.1: В настоящее время я борюсь с записью из MQL в буфер, а строка в MQL является копией pBuf (из C ), преобразованной в строку.
И мне нужно изменить буфер из MQL.

p.s. 2: p.s. 1 решаемая, вот рабочий пример: https://www.mql5.com/en/articles/364#3