DDE::IDDECltConv* CDDEClient::FindConversation(HCONV hConv) const { // Search the conversation list. for (size_t i = 0, n = m_aoConvs.size(); i != n; ++i) { CDDECltConv* pConv = static_cast<CDDECltConv*>(m_aoConvs[i]); if (pConv->Handle() == hConv) return pConv; } return nullptr; }
void CNetDDESvrApp::OnDDECreateConversation(CNetDDESvrSocket& oConnection, CNetDDEPacket& oReqPacket) { ASSERT(oReqPacket.DataType() == CNetDDEPacket::DDE_CREATE_CONVERSATION); bool bResult = false; CString strService; CString strTopic; HCONV hConv = NULL; uint32 nConvID = m_nNextConvID++; // Decode request message. CMemStream oReqStream(oReqPacket.Buffer()); oReqStream.Open(); oReqStream.Seek(sizeof(CNetDDEPacket::Header)); oReqStream >> strService; oReqStream >> strTopic; oReqStream.Close(); if (App.m_bTraceConvs) App.Trace(TXT("DDE_CREATE_CONVERSATION: %s %s [#%u]"), strService, strTopic, nConvID); try { // Call DDE to create the conversation. CDDECltConv* pConv = m_pDDEClient->CreateConversation(strService, strTopic); bResult = true; hConv = pConv->Handle(); // Attach to the connection. oConnection.m_aoNetConvs.Add(new CNetDDEConv(pConv, nConvID)); // Apply settings. pConv->SetTimeout(App.m_nDDETimeOut); } catch (CDDEException& e) { App.Trace(TXT("DDE_ERROR: %s"), e.twhat()); } // Create response message. CBuffer oRspBuffer; CMemStream oRspStream(oRspBuffer); oRspStream.Create(); oRspStream << bResult; oRspStream.Write(&hConv, sizeof(hConv)); oRspStream << nConvID; oRspStream.Close(); // Send response message. CNetDDEPacket oRspPacket(CNetDDEPacket::DDE_CREATE_CONVERSATION, oReqPacket.PacketID(), oRspBuffer); oConnection.SendPacket(oRspPacket); // Update stats. ++m_nPktsSent; }