Этот код работал безупречно вплоть до тестирования его в MT4 build 600, где он больше не верифицирует счета с моего сервера.
Спасибо за ваше предложение, angevoyageur, но я попробовал поменять все Ansi 'A' на W, но все равно безрезультатно.
Ваша проблема будет связана с функцией InternetReadFile(). Смотрите EasyXml.mqh на https://www.mql5.com/en/code/1998 для примера использования функций WinInet в новом MQL4 - код работает как в MQL4, так и в MQL5.
По сути, вы передаете массив uchar[] в InternetReadFile(), а затем преобразуете массив в строку с помощью CharArrayToString(). По сути, теперь в MQL4 вы можете выделять управляемые буферы памяти произвольной длины, передавать их DLL, а затем преобразовывать данные из Ansi или Unicode в зависимости от ситуации.
По сути, вы передаете массив uchar[] в InternetReadFile(), а затем преобразуете массив в строку с помощью CharArrayToString(). По сути, теперь в MQL4 вы можете выделять управляемые буферы памяти произвольной длины, передавать их DLL, а затем преобразовывать данные из Ansi или Unicode в зависимости от ситуации.
Немного расширяя тему и ответ... в новом MQL4 можно вызывать как A, так и W версии многих функций. Например, следующий скрипт получает временный каталог Windows, используя оба вызова GetTempPathA и GetTempPathW:
#import "kernel32.dll" int GetTempPathA(int,uchar & arr[]); int GetTempPathW(int,short & arr[]); #import void OnStart() { uchar AnsiStringBuffer[256]; GetTempPathA(255, AnsiStringBuffer); string strTempPathFromA = CharArrayToString(AnsiStringBuffer); short UnicodeStringBuffer[256]; GetTempPathW(255, UnicodeStringBuffer); string strTempPathFromW = ShortArrayToString(UnicodeStringBuffer); Print("Temp path via GetTempPathA(): ", strTempPathFromA); Print("Temp path via GetTempPathW(): ", strTempPathFromW); }
Таким образом, можно продолжать использовать многие вызовы Ansi-only DLL из нового MQL4: не обязательно обновлять как код MQL4 , так и DLL.
Поэтому можно продолжать использовать многие вызовы Ansi-only DLL из нового MQL4: не обязательно обновлять как код MQL4 , так и DLL.
... Другой пример: передача строковых значений в вызов Ansi DLL из нового MQL4. (В реальной жизни вы, очевидно, просто вызовете MessageBoxW, а не будете использовать это обходное решение для вызова MessageBoxA, но общий смысл полезен).
#import "user32.dll" // Declare the Ansi function as taking uchar[] input parameters instead of strings int MessageBoxA(int,uchar & arr1[],uchar & arr2[],int); #import void OnStart() { string strMessage = "Hello"; string strTitle = "Hi!"; // Convert the strings to uchar[] arrays uchar ucMessage[], ucTitle[]; StringToCharArray(strMessage, ucMessage); StringToCharArray(strTitle, ucTitle); MessageBoxA(0, ucMessage, ucTitle, 64); }
Я играю с этим уже несколько часов, но все еще безрезультатно. Так что да, ищу кого-нибудь, кто сделает это для меня ;)
Я играю с этим уже несколько часов, но все еще безрезультатно. Так что да, ищу кого-нибудь, кто сделает это для меня ;)
См. https://www. mql5.com/en/forum/149360 - Я собирался опубликовать это как ответ здесь, но потом обнаружил проблему...
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Этот код работал безупречно до тех пор, пока я не протестировал его в MT4 build 600, где он больше не верифицирует счета с моего сервера.