Друзья, помогите с CSocket::OnReceive

 
Использую мфцешный класс CSocket.


В обычном диалоговом приложении все отрабатывает четко. Отправка по Send, прием по событию на OnReceive без проблем.

Но при переносе класса в dll - функция OnReceive не вызывается.
то есть начало отрабатывает нормально (Create/Connect), и функция отправки Send работает. Но функция OnReceive, для инициализации приема не вызывается.

В гугле уже обчитался, эта проблема частая, но предлагаемого решения не нашел.
Моя догадка, что вызов события до сокета почему то не передается. Причина может быть, что поток этой dll, в котором сокет создается, не отправляет его окну (CSocketWnd) требуемое событие, ну и как следствие OnReceive не вызывается.

Может надо окно создать и в нем сокет.
Или UI-поток ? С потоком кстати я пытался сделать (AfxBeginThread), но OnReceive тоже не заработал.

Помогите советом или кодом, кто чем может, а то затраха замучился с ним.

вот весь код что в DLL

class CExtSocket : public CSocket
{
public:
  CExtSocket(){};
  virtual ~CExtSocket(){};

  virtual void OnReceive(int nErrorCode);  <--- вот эта козявка меня добивает
};

void CExtSocket::OnReceive(int nErrorCode)
{
  AfxMessageBox(_T("Receive"));
  CSocket::OnReceive(nErrorCode);
}


#define EXT extern "C" __declspec(dllexport)

CExtSocket sock;

//------------------------------------------------------------------    _Create
EXT int __stdcall _Create() // создание объекта сокета
{
  AFX_MANAGE_STATE(AfxGetStaticModuleState());
  return(sock.Create());
}
//------------------------------------------------------------------    _Connect
EXT int __stdcall _Connect(LPCTSTR addr, UINT port) // подключение сокета к хосту
{
  AFX_MANAGE_STATE(AfxGetStaticModuleState());
  return(sock.Connect(addr, port));
}
//------------------------------------------------------------------    _Send
EXT int __stdcall _Send(void *buf, int len, int flag=0) // отправляем буфер в сокет длиной len
{
  AFX_MANAGE_STATE(AfxGetStaticModuleState());
  return(sock.Send(buf, len, flag));
}
//------------------------------------------------------------------    _Receive
EXT int __stdcall _Receive(void *buf, int len, int flag=0) // принимаем байтовый буфер длиной len
{
  AFX_MANAGE_STATE(AfxGetStaticModuleState());
  return(sock.Receive(buf, len, flag));
}
//------------------------------------------------------------------    _Close
EXT void __stdcall _Close() // закрываем сокет в системе
{
  AFX_MANAGE_STATE(AfxGetStaticModuleState());
  sock.Close();
}
 
Используйте чистые синхронные вызовы, а не асинхронные коллбеки типа onreceive.
 

то есть все сделать на основе WinSock и функции send/recv ?

но тогда ведь прийдется намертво зацикливать функцию проверки пришедших данных ?

Winsock Functions (Windows)
  • msdn.microsoft.com
The following list provides concise descriptions of each Winsock function. For additional information on any function, click the function name. FunctionDescription Establishes a connection to a specified socket, and optionally sends data once the connection is established. Only supported on connection-oriented sockets. Queries a...
 
Да, через синхронный винсок.
К сожалению, внутри MQL5 нельзя организовывать асинхронные вызовы по вполне понятным техническим причинам.
 

я просто планировал сделать такую простую связку - получаю CSocket::OnReceive -> в ней SendMessage(WM_KEYDOWN) на окно чарта о нотификации что есть данные  -> и далее MQL вычитывает по Receive в фунции OnChartEvent.

но вот как раза до первой цепочки - OnReceive - событие из недр винды не доходит. а так бы было красиво... :)

попробую винсок прямо в mql импортнуть, без промежуточной dll. И сам скрипт MQL зациклить на таймер или чартевент на себя.

Причина обращения: