#if !defined(AFX_IPCCHANNEL_H__D5C2E22C_3F03_4B0E_9D9F_80B686EDBD47__INCLUDED_) # define AFX_IPCCHANNEL_H__D5C2E22C_3F03_4B0E_9D9F_80B686EDBD47__INCLUDED_ # if _MSC_VER > 1000 # pragma once # endif // _MSC_VER > 1000 struct IIPCChannelCallback { virtual void OnIPCPeerConnected() = 0; virtual LRESULT OnIPCNotificationReceived(WORD wCode, LPARAM lParam) = 0; virtual LRESULT OnIPCDataReceived(WORD wCode, const void* pData, SIZE_T cbSize) = 0; virtual void OnIPCPeerDisconnected() = 0; }; class CSharedBlob; class CIPCChannel { public: explicit CIPCChannel(IIPCChannelCallback& callback); ~CIPCChannel(); void OpenServerChannel(HWND hwndLocal); void OpenClientChannel(HWND hwndLocal, HWND hwndRemote); void CloseChannel(); BOOL IsOpen() const; BOOL IsServer() const; BOOL IsClient() const; void PostNotification(WORD wCode, LPARAM lParam = 0); LRESULT SendNotification(WORD wCode, LPARAM lParam = 0); LRESULT SendData(WORD wCode, const void* pData, SIZE_T cbSize); BOOL ProcessMessage(UINT nMessage, WPARAM wParam, LPARAM lParam, LRESULT& lResult); private: enum ChannelType { UninitializedChannel, ClientChannel, ServerChannel }; enum IPCCommand { cmdClientAttached, cmdClientAttachedACK, cmdPeerDisconnected, cmdNotification, cmdData }; BOOL IsPeerAccessible(); void CloseChannel(BOOL bNotifyPeer); void ExecuteAsync(IPCCommand cmd, WORD wCode, LPARAM lParam = 0); LRESULT Execute(IPCCommand cmd, WORD wCode, LPARAM lParam = 0); CSharedBlob* SetBlob(const void* pData, SIZE_T cbData); void ReleaseBlob(); LRESULT OnCmdClientAttached(LPARAM lParam); LRESULT OnCmdClientAttachedACK(LPARAM lParam); LRESULT OnCmdPeerDisconnected(LPARAM lParam); LRESULT OnCmdNotification(WORD wCode, LPARAM lParam); LRESULT OnCmdData(WORD wCode, LPARAM lParam); private: static const UINT m_WM_IPC; ChannelType m_type; HWND m_hwndLocal; HWND m_hwndRemote; IIPCChannelCallback& m_Callback; CSharedBlob* m_pCurrentBlob; }; #endif // !defined(AFX_IPCCHANNEL_H__D5C2E22C_3F03_4B0E_9D9F_80B686EDBD47__INCLUDED_)