u_long option = TRUE;
ioctlsocket(hClntSock, FIONBIO, &option);
필터클래스 상위 부분에
// 인터페이스 선언
#ifdef __cplusplus
extern "C" {
#endif
// {45F7E6B9-861F-46fb-9549-7F70EB5DCFF0}
DEFINE_GUID(IID_INetworkTCP,
0x45f7e6b9, 0x861f, 0x46fb, 0x95, 0x49, 0x7f, 0x70, 0xeb, 0x5d, 0xcf, 0xf0);
DECLARE_INTERFACE_(INetworkTCP, IUnknown)
{
STDMETHOD(LoadMessageBox) (THIS_ char* msg) PURE;
};
#ifdef __cplusplus
}
#endif
//////////////////////////////////////////////////////////////////////////
위와 같이 인터페이스를 선언해주고
class CNetworkTCPStream;
인터페이스를 상속받는다.
class CNetworkTCPFilter : public CSource, public INetworkTCP
{
friend class CNetworkTCPStream;
public:
CNetworkTCPFilter(LPUNKNOWN pUnk, HRESULT *phr);
virtual ~CNetworkTCPFilter(void);
// static
public:
static CUnknown * WINAPI CreateInstance(LPUNKNOWN pUnk, HRESULT *phr);
// Attributes
public:
// Operations
public:
// 이 메소드는 인터페이스의 가상함수. 구현하여준다.
STDMETHODIMP LoadMessageBox(char* msg) {
MessageBox(NULL, msg, NULL, NULL);
}
// Overrides
protected:
// Implementations
protected:
// 인터페이스를 외부에 노출시킨다
DECLARE_IUNKNOWN;
STDMETHODIMP NonDelegatingQueryInterface(REFIID riid, void **ppv) {
if(riid == IID_INetworkTCP)
return GetInterface((INetworkTCP*)this, ppv);
else
return CSource::NonDelegatingQueryInterface(riid, ppv);
}
// member variables
private:
};
위와 같이 하면 인터페이스를 상속받고 구현하여 노출시키면 사용할 수 있다.
사용방법은 어플리케이션에서 인터페이스 선언부분을 가져다 적어주고
인터페이스를 호출하여 사용하면 된다.
예)
INetworkTCP* pITCP;
pFilterNetworkTCPFilter->QueryInterface(IID_INetworkTCP, (void**)&pITCP);
pITCP->LoadMessageBox("Test");
void CTestDlg::TrayIcon()
{
if(!m_TaskFlag)
{
ShowWindow(SW_HIDE);
NOTIFYICONDATA nid;
nid.cbSize = sizeof(nid);
nid.hWnd = m_hWnd; //현재 다이얼로그의 윈도우 핸들
nid.uID = IDR_MAINFRAME; //아이콘의 리소스ID
nid.uFlags = NIF_MESSAGE|NIF_ICON|NIF_TIP;
nid.uCallbackMessage = UM_ICONNOTIFY; //우리가 만든 메시지
nid.hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
lstrcpy(nid.szTip,"우리가 만든 태스크바"); // 툴팁
Shell_NotifyIcon(NIM_ADD,&nid);
// taskBar상태영역에 아이콘 추가,삭제,수정할때 시스템에 메시지 전달
SendMessage(WM_SETICON,(WPARAM)TRUE,(LPARAM)nid.hIcon);
// taskBar 상태영역에 아이콘 설정
m_TaskFlag = TRUE;
}
}
이 함수를 실행하면 현재의 창이 사라지면서 트레이 아이콘이 생깁니다.
void CDetectPointDlg::TrayCallback(WPARAM wParam, LPARAM lParam)
{
switch(lParam)
{
case WM_RBUTTONDOWN:
AfxMessageBox("트레이 아이콘!");
break;
case WM_LBUTTONDOWN:
ShowWindow(SW_SHOW);
m_TaskFlag = FALSE;
break;
case WM_RBUTTONDBLCLK:
CMenu menu, *pSubMenu;
if(!menu.LoadMenu(IDR_MENU)) return 0;
if(!(pSubMenu = menu.GetSubMenu(0))) return 0;
CPoint pos;
GetCursorPos(&pos);
SetForegroundWindow();
pSubMenu->TrackPopupMenu(TPM_RIGHTALIGN, pos.x, pos.y, this);
menu.DestroyMenu();
break;
}
}
이 함수는 오른쪽 밑에 있는 트레이 아이콘에 대한 이벤트 처리하는 부분이고요...
BEGIN_MESSAGE_MAP에 메세지 연결 해주시고...
ON_MESSAGE(UM_ICONNOTIFY,TrayCallback) // 메시지 추가
#define UM_ICONNOTIFY WM_USER+6001
이것두 추가해 주셔야 합니다...
// 트레이 종료..
Shell_NotifyIcon(NIM_DELETE, &nid);