Вы что-нибудь читали о том, что строки в обновлённом MQL4 - юникодные?
stringo:
Вы что-нибудь читали о том, что строки в обновлённом MQL4 - юникодные?
Вы что-нибудь читали о том, что строки в обновлённом MQL4 - юникодные?
Оп-па...нет, пропустил это момент..
Разобрался.
Вывод простой. Следить надо за обновлениями :)
Вот рабочий пример. Может кому-то пригодиться.
*VC 2005
*MT build 670
DLL:
// Подключение к серверу MT4_EXPFUNC bool __stdcall ServerConnect(wchar_t *Host, int Port) { char *ServerAddress = unicode_to_1251(Host); char buff[1024]; // Шаг 1 инициализация библиотеки Winsock if (WSAStartup(0x202,(WSADATA *)&buff[0])) {return(false);}; // Шаг 2 создание сокета SOCKET client_sock; client_sock = socket(AF_INET,SOCK_STREAM,0); if (client_sock < 0) {return(false);} // Шаг 3 установка соединения заполнение структуры sockaddr_in – указание адреса и порта сервера sockaddr_in dest_addr; dest_addr.sin_family = AF_INET; dest_addr.sin_port = htons(PORT); HOSTENT *hst; // преобразование IP адреса из символьного в сетевой формат if (inet_addr(ServerAddress) != INADDR_NONE) dest_addr.sin_addr.s_addr = inet_addr(ServerAddress); else // попытка получить IP адрес по доменному имени сервера if (NULL == (hst = gethostbyname(ServerAddress))) {return(false);} else {closesocket(client_sock); WSACleanup(); return(false);} // адрес сервера получен – пытаемся установить соединение if (connect(client_sock,(sockaddr *)&dest_addr,sizeof(dest_addr))) {return(false);} // Соединение установлено return(true); }
char * unicode_to_1251(wchar_t *unicode_string) { int err; char * res; int res_len = WideCharToMultiByte( 1251, // Code page 0, // Default replacement of illegal chars unicode_string, // Multibyte characters string -1, // Number of unicode chars is not known NULL, // No buffer yet, allocate it later 0, // No buffer NULL, // Use system default NULL // We are not interested whether the default char was used ); if (res_len == 0) {return NULL;} res = (char *) calloc(sizeof(char), res_len); if (res == NULL) {return NULL;} err = WideCharToMultiByte( 1251, // Code page 0, // Default replacement of illegal chars unicode_string, // Multibyte characters string -1, // Number of unicode chars is not known res, // Output buffer res_len, // buffer size NULL, // Use system default NULL // We are not interested whether the default char was used ); //if (err == 0) {free(res); return NULL;} return res; }
MQL:
#import "Client.dll" bool ServerConnect(string ServerAddress, int Port); #import int start() { bool conn; conn = ServerConnect("127.0.0.1",2305); Print(conn); return(0); }
Вы упускаете торговые возможности:
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Регистрация
Вход
Вы принимаете политику сайта и условия использования
Если у вас нет учетной записи, зарегистрируйтесь
Пишу dll, в которой будет происходить подключение к серверу и обмен данными с сервером, но возникла сложность с передачей string в функцию, где в дальнейшем используется указатель char * на переданную строку..
Проблема возникает в строчке:
if (inet_addr(SERVERADDR)!=INADDR_NONE)dest_addr.sin_addr.s_addr=inet_addr(SERVERADDR);
пока просто объявил на время разработки
#define SERVERADDR "127.0.0.1"
но в дальнейшем как-то это надо решать, но не нашел в инете рабочего варианта.
Точнее некоторые помогли, компилятор на преобразование не ругается, но при вызове библиотечной функции из программы, в которой ее подключаю выходит ошибка Access violation read to 0x1057FFFC in '......
вот код