- Браузерная платформа MetaTrader 5
- Просмотр и настройка графиков - Графики котировок, технический и фундаментальный анализ
- Маркет - магазин приложений
#import "kernel32.dll" int CreateFileMappingA( int hFile, // handle to file to map int lpFileMappingAttributes, // optional security attributes int flProtect, // protection for mapping object int dwMaximumSizeHigh, // high-order 32 bits of object size int dwMaximumSizeLow, // low-order 32 bits of object size string lpName // name of file-mapping object ); int OpenFileMappingA( int dwDesiredAccess, // access mode int bInheritHandle, // inherit flag string lpName // pointer to name of file-mapping object ); int MapViewOfFileA( int hFileMappingObject, // file-mapping object to map into // address space int dwDesiredAccess, // access mode int dwFileOffsetHigh, // high-order 32 bits of file offset int dwFileOffsetLow, // low-order 32 bits of file offset int dwNumberOfBytesToMap // number of bytes to map ); int UnmapViewOfFileA( int lpBaseAddress // address where mapped view begins ); #import #define PAGE_READONLY 0x02 #define PAGE_READWRITE 0x04 #define FILE_MAP_WRITE 0x0002 #define FILE_MAP_READ 0x0004
Использование:
int MemShare(int NumberOfBytes, string memName) { int m_hfm = CreateFileMappingA( -1, 0, PAGE_READWRITE, 0, NumberOfBytes, memName); return (MapViewOfFileA(m_hfm, FILE_MAP_WRITE, 0, 0, 0)); }
В языках программирования Си, Дельфи и т.д. функция MemShare возвратила бы указатель, через этот указатель можно было бы работать с массивом. В одном месте заполнил массив. В другом через OpenFileMappingA открыл этот массив для доступа. В MQL4 указателей нет. Появляется вопрос, как подставить объявленный объект массива под MemShare, OpenFileMappingA, возможно ли это?
#import "kernel32.dll" int CreateFileA( string lpFileName, // pointer to name of the file int dwDesiredAccess, // access (read-write) mode int dwShareMode, // share mode int lpSecurityAttributes, // pointer to security attributes int dwCreationDisposition, // how to create int dwFlagsAndAttributes, // file attributes int hTemplateFile // handle to file with attributes to // copy ); int CreateFileMappingA( int hFile, // handle to file to map int lpFileMappingAttributes, // optional security attributes int flProtect, // protection for mapping object int dwMaximumSizeHigh, // high-order 32 bits of object size int dwMaximumSizeLow, // low-order 32 bits of object size string lpName // name of file-mapping object ); int OpenFileMappingA( int dwDesiredAccess, // access mode int bInheritHandle, // inherit flag string lpName // pointer to name of file-mapping object ); int MapViewOfFile( int hFileMappingObject, // file-mapping object to map into // address space int dwDesiredAccess, // access mode int dwFileOffsetHigh, // high-order 32 bits of file offset int dwFileOffsetLow, // low-order 32 bits of file offset int dwNumberOfBytesToMap // number of bytes to map ); int UnmapViewOfFile( int lpBaseAddress // address where mapped view begins ); #import #define GENERIC_READ 0x80000000 #define GENERIC_WRITE 0x40000000 #define FILE_SHARE_READ 0x1 #define FILE_SHARE_WRITE 0x2 #define CREATE_NEW 1 #define CREATE_ALWAYS 2 #define OPEN_EXISTING 3 #define OPEN_ALWAYS 4 #define PAGE_READONLY 0x2 #define PAGE_READWRITE 0x4 #define FILE_MAP_WRITE 0x2 #define FILE_MAP_READ 0x4
и
int MemShare(int nBytes, string fName) { int m_hf = CreateFileA(fName, GENERIC_READ | GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, 0, CREATE_ALWAYS, 0, 0); int m_hfm = CreateFileMappingA( m_hf, 0, PAGE_READWRITE, 0, nBytes, 0); int m_mv = MapViewOfFile(m_hfm, FILE_MAP_WRITE, 0, 0, 0); Comment("fName = ",fName,", m_hf = ",m_hf,", m_hfm = ",m_hfm, ", m_mv = ",m_mv); return(m_mv); }
Создался файл на 10000 байт в корневой директории диска и был замаппирован, об этом показал коммент.
Только вот как этот кусок памяти под массив подвести, вопрос вопросов?
#import "msvcrt.dll" int memcpy( int dest, double src[], int count ); #import
и
int h_mem = 0; double d_mem[]; ... if (h_mem == 0) { ArrayResize(d_mem, 250); ArrayInitialize(d_mem, 1.1111); h_mem = MemShare(elems, memName); memcpy(h_mem, d_mem, 2000); }
Копирование в память и файл действительно происходит, но сильно ругается:
"There has been a critical error
Time : 2006.08.17 18:33
Program : Client Terminal
Version : 4.00 (build: 195, 30 Jun 2006)
Owner : FIBO Group, Ltd. (FIBO Group)
OS : Windows 2000 Server 5.0 Service Pack 4 (Build 2195)
Processors : 1, type 586, level 15
Memory : 507348/53536 kb
Exception : C0000005
Address : CB295E9E
Access Type : read
Access Addr : CB295E9E
Registers : EAX=00000000 CS=001b EIP=CB295E9E EFLGS=00010246
: EBX=000007D0 SS=0023 ESP=001289E4 EBP=00128A1C
: ECX=01A82678 DS=0023 ESI=01A827C0 FS=0038
: EDX=0000002F ES=0023 EDI=011AEE1C GS=0000
Stack Trace : 0045055A 00000000 00000000 00000000
: 00000000 00000000 00000000 00000000
: 00000000 00000000 00000000 00000000
: 00000000 00000000 00000000 00000000
Modules :
1 : 00400000 00292000 E:\programs\MT4\FG\terminal.exe
2 : 60000000 00045000 D:\WINNT\system32\MSCTF.dll
3 : 6B2C0000 00005000 D:\WINNT\system32\MSIMG32.dll
4 : 6C370000 000FB000 D:\WINNT\system32\MFC42.DLL
5 : 70A70000 00066000 D:\WINNT\system32\SHLWAPI.dll
6 : 71710000 00084000 D:\WINNT\system32\COMCTL32.dll
7 : 75020000 00008000 D:\WINNT\system32\WS2HELP.DLL
8 : 75030000 00014000 D:\WINNT\system32\WS2_32.dll
9 : 75E60000 0001A000 D:\WINNT\system32\IMM32.DLL
10 : 76B30000 0003E000 D:\WINNT\system32\comdlg32.dll
11 : 770C0000 00023000 D:\WINNT\system32\CSCDLL.DLL
12 : 77570000 00030000 D:\WINNT\system32\WINMM.dll
13 : 77840000 0003E000 D:\WINNT\system32\cscui.dll
14 : 779B0000 0009B000 D:\WINNT\system32\OLEAUT32.dll
15 : 77D30000 0006F000 D:\WINNT\system32\RPCRT4.dll
16 : 77E10000 00069000 D:\WINNT\system32\USER32.DLL
17 : 77F40000 0003C000 D:\WINNT\system32\GDI32.dll
18 : 77F80000 0007C000 D:\WINNT\system32\ntdll.dll
19 : 78000000 00045000 D:\WINNT\system32\MSVCRT.DLL
20 : 7C2D0000 00065000 D:\WINNT\system32\ADVAPI32.DLL
21 : 7C570000 000B4000 D:\WINNT\system32\KERNEL32.dll
22 : 7C950000 0008F000 D:\WINNT\system32\CLBCATQ.DLL
23 : 7CE20000 000EF000 D:\WINNT\system32\ole32.dll
24 : 7CF30000 00246000 D:\WINNT\system32\SHELL32.dll
Call stack :
004503C0:019A [0045055A] ?InitFunctionInt@CExpertInterior"
Индикатор рисуется на графике.
mem объявляется глобальной переменной
int mem = malloc(num * 8)
данные индикатора копируются по адресу mem через memcpy
На другом таймфрейме с адреса mem скопировать обратно в массив
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования