Скачать MetaTrader 5
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий
Поделись программой в CodeBase. Получи доступ к миллионам трейдеров!
Denis Yakushev
481
Denis Yakushev 2014.07.31 18:03 
Доброго времени суток!
Пишу 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 '......


вот код

// Подключение к серверу
MT4_EXPFUNC bool __stdcall ServerConnect(string Host, int Port)
{
	
	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;
	//HOSTENT *h_addr_list; 
	// преобразование IP адреса из символьного в сетевой формат
	if (inet_addr(SERVERADDR)!=INADDR_NONE)dest_addr.sin_addr.s_addr=inet_addr(SERVERADDR);
	else
		// попытка получить IP адрес по доменному имени сервера
		if (NULL == (hst = gethostbyname(SERVERADDR))) {return(false);}
		/*
		if (hst = gethostbyname(SERVERADDR))
			// hst > h_addr_list содержит не массив адресов, а массив указателей на адреса
			((unsigned long *)&dest_addr.sin_addr)[0]=((unsigned long **)hst>h_addr_list)[0][0];
		*/
		else
		{closesocket(client_sock); WSACleanup(); return(false);}
		// адрес сервера получен – пытаемся установить соединение
		if (connect(client_sock,(sockaddr *)&dest_addr,sizeof(dest_addr))) {return(false);}
		// Соединение установлено
		return(true);
}
Slawa
Модератор
6676
Slawa 2014.08.01 06:19  
Вы что-нибудь читали о том, что строки в обновлённом MQL4 - юникодные?
Denis Yakushev
481
Denis Yakushev 2014.08.01 07:02  
stringo:
Вы что-нибудь читали о том, что строки в обновлённом MQL4 - юникодные?

Оп-па...нет, пропустил это момент..
Denis Yakushev
481
Denis Yakushev 2014.08.01 13:54  

Разобрался.

Вывод простой. Следить надо за обновлениями :)

Вот рабочий пример. Может кому-то пригодиться.


*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);
  }
/
Авторизуйтесь или зарегистрируйтесь, чтобы добавить комментарий