Вобщем портирую (давно и безуспешно) некоторый код который нормально пашет под x86 терминалом.
Ни дебажить, ни определить где глюка не представляется возможным. Возможно просто ошибка фундаментальная и я чего-то не догоняю\не замечаю\не понимаю.
Кто разбирается в теме, пожалуйста, просмотрите на предмет ляпов, неправильного подхода, наставьте на путь истинный.
Вот такой импорт:
Вот функции которые не дружат с терминалом (причем в дебаге и не в дебаге падает в разных местах)
может для полной однозначности вот таким манером все сделать при импорте:
#import "kernel32.dll" int DeleteFileW (string lpFileName); if (_IsX64) int CloseHandle(long hObject); else int CloseHandle(int hObject); ... ... ...
Что-то посмотрел в справке MQL5, не нашел там _IsX64. Есть стандартная функия TerminalInfoInteger. Может этот _IsX64 нечто недокументированное и иногда не работает?
if(true == (bool)TerminalInfoInteger(TERMINAL_X64)) size = GetFileSize(hFile, (long)0); else size = GetFileSize((int)hFile, (int)0);
У Вас в коде всё нормально, неправильно только размер массива Win32Data.
Должно быть так:
int Win32Data[148];
А ещё лучше определить структуру.
#define MAX_PATH 260 struct FILETIME { DWORD dwLowDateTime; DWORD dwHighDateTime; }; struct WIN32_FIND_DATA { DWORD dwFileAttributes; FILETIME ftCreationTime; FILETIME ftLastAccessTime; FILETIME ftLastWriteTime; DWORD nFileSizeHigh; DWORD nFileSizeLow; DWORD dwReserved0; DWORD dwReserved1; WCHAR cFileName[ MAX_PATH ]; WCHAR cAlternateFileName[ 14 ]; };Дефайна нет и не будет. Я уже просил в сервисдеске.
Я его определяю сам.
#define _WIN64 // Только для 64-разрядного терминала!
В этом даже есть свой плюс: можно в одном терминале компилировать и для 32 и для 64 разрядного терминала.
После этого вставляю такие определения:
#ifdef _WIN64 #define PVOID ulong #else #define PVOID uint #endif #define HANDLE PVOID #define HWND PVOID #define BOOL int #define FALSE 0 #define TRUE 1 #define BYTE uchar #define WORD ushort #define DWORD uint #define UINT uint #define CHAR char #define WCHAR ushort
Тогда объявления функций будут такие:
#import "kernel32.dll" BOOL DeleteFileW( string lpFileName ); BOOL CloseHandle( HANDLE hObject ); HANDLE CreateFileW( string lpFileName, DWORD dwDesiredAccess, DWORD dwShareMode, PVOID lpSecurityAttributes, DWORD dwCreationDisposition, DWORD dwFlagsAndAttributes, PVOID hTemplateFile ); DWORD SetFilePointer( HANDLE hFile, int lDistanceToMove, int& lpDistanceToMoveHigh, uint dwMoveMethod ); BOOL SetEndOfFile( HANDLE hFile ); BOOL ReadFile( HANDLE hFile, ushort& lpBuffer[], uint nNumberOfBytesToRead, uint& lpNumberOfBytesRead, PVOID lpOverlapped ); BOOL WriteFile( HANDLE hFile, int& lpBuffer[], uint nNumberOfBytesToWrite, uint& lpNumberOfBytesWritten, PVOID lpOverlapped ); DWORD GetFileSize( HANDLE hFile, PVOID lpFileSizeHigh ); HANDLE FindFirstFileW( string path, WIN32_FIND_DATA& lpFindFileData ); BOOL FindNextFileW( HANDLE hFindFile, WIN32_FIND_DATA& lpFindFileData ); BOOL FindClose( HANDLE hFindFile ); BOOL CreateDirectoryW( string path, PVOID securityAttributes ); #import
Да вроде правильный размер... должен быть 320 байт 80*4 как раз
____________
Ан нет, ваша правда, 592 байта. 320 байт было для не юникода.

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Вобщем портирую (давно и безуспешно) некоторый код который нормально пашет под x86 терминалом.
Ни дебажить, ни определить где глюка не представляется возможным. Возможно просто ошибка фундаментальная и я чего-то не догоняю\не замечаю\не понимаю.
Кто разбирается в теме, пожалуйста, просмотрите на предмет ляпов, неправильного подхода, наставьте на путь истинный.
Вот такой импорт:
Вот функции которые не дружат с терминалом (причем в дебаге и не в дебаге падает в разных местах)