void CNetDDESvrApp::OnDDEStopAdvise(CNetDDESvrSocket& oConnection, CNetDDEPacket& oReqPacket) { ASSERT(oReqPacket.DataType() == CNetDDEPacket::DDE_STOP_ADVISE); HCONV hConv; uint32 nConvID; CString strItem; uint32 nFormat; // Decode message. CMemStream oStream(oReqPacket.Buffer()); oStream.Open(); oStream.Seek(sizeof(CNetDDEPacket::Header)); oStream.Read(&hConv, sizeof(hConv)); oStream >> nConvID; oStream >> strItem; oStream >> nFormat; oStream.Close(); if (App.m_bTraceAdvises) App.Trace(TXT("DDE_STOP_ADVISE: %s %s"), strItem, CClipboard::FormatName(nFormat)); // Locate the conversation. CDDECltConv* pConv = m_pDDEClient->FindConversation(hConv); if (pConv != NULL) { // Locate the link. (May not exist, if async advised). CDDELink* pLink = pConv->FindLink(strItem, nFormat); if (pLink != NULL) { CNetDDEConv* pNetConv = oConnection.FindNetConv(pConv, nConvID); ASSERT(pNetConv != NULL); try { // Call DDE to destroy the link. pConv->DestroyLink(pLink); } catch (CDDEException& e) { App.Trace(TXT("DDE_ERROR: %s"), e.twhat()); } // Detach from the connection. pNetConv->m_aoLinks.Remove(pNetConv->m_aoLinks.Find(pLink)); } } }
void CDDEClient::OnAdvise(HCONV hConv, const tchar* /*pszTopic*/, const tchar* pszItem, uint nFormat, const CDDEData* pData) { // Find the conversation for the handle. CDDECltConv* pConv = static_cast<CDDECltConv*>(FindConversation(hConv)); ASSERT(pConv != nullptr); // Find the link. CDDELink* pLink = pConv->FindLink(pszItem, nFormat); // May still be in the Advise Start. if (pLink == nullptr) { // TRACE3("OnAdvise('%s|%s', '%s') - Failed to find link\n", pConv->Service(), pConv->Topic(), pszItem); return; } for (size_t i = 0, n = m_aoListeners.size(); i != n; ++i) m_aoListeners[i]->OnAdvise(pLink, pData); }