www.pudn.com > IPServer.rar > IpRegDemoDlg.cpp
// IpRegDemoDlg.cpp : 实现文件 // #include "stdafx.h" #include "IpRegDemo.h" #include "IpRegDemoDlg.h" #include ".\ipregdemodlg.h" #include "server.h" #include "ToolReg.h" #includeusing namespace std; #ifdef _DEBUG #define new DEBUG_NEW #endif #define WM_NOTIFYICON WM_USER+1100 #define WM_CALLBACK WM_USER+1101 HWND m_hwnd=NULL; CListCtrl *g_list=NULL; CToolReg g_hikreg; // 用于应用程序“关于”菜单项的 CAboutDlg 对话框 int GetConfig(BOOL *plog, BOOL *prunatstart) { FILE *fpConfig; char line[100]; string strRun; string strLog; string strRemain; int pos; char path[100]; GetCurrentPath(path); strcat(path,"\\ConfigLog.txt"); if ( (fpConfig = fopen(path, "r"))== NULL) { TRACE("Open ConfigLog.txt error\n"); return -1; } fgets(line,100, fpConfig); strLog=string(line); pos = strLog.find_first_of('\t'); strRemain=strLog.substr(pos+1,pos+4); TRACE("strLog=%s",strLog.c_str()); if (strncmp("yes",strRemain.c_str(),3)== 0) { *plog=TRUE; } else { *plog=FALSE; } fgets(line,100,fpConfig); strRun=string(line); pos = strRun.find_first_of('\t'); strRemain=strRun.substr(pos+1); TRACE("strRun=%s",strRun.c_str()); if (strncmp("yes",strRemain.c_str(),3)== 0) *prunatstart=TRUE; else *prunatstart=FALSE; fclose(fpConfig); return 0; } void GetCurrentPath(char *path) { HRESULT hr = S_OK; CRegKey rk_run; int pos; //char path[100]; string strpath; CString spath; //if(SUCCEEDED(hr = rk_run.Open( HKEY_LOCAL_MACHINE,\ // _T("Software\\Microsoft\\Windows\\CurrentVersion\\Run"),KEY_ALL_ACCESS))) //{ g_hikreg.RegGetAppPath(&spath); strpath=string(spath.GetBuffer(0)); pos=strpath.find_last_of('\\'); strcpy(path,strpath.substr(0,pos).c_str()); /*}*/ } class CAboutDlg : public CDialog { public: CAboutDlg(); // 对话框数据 enum { IDD = IDD_ABOUTBOX }; protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持 // 实现 protected: DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) END_MESSAGE_MAP() // CIpRegDemoDlg 对话框 CIpRegDemoDlg::CIpRegDemoDlg(CWnd* pParent /*=NULL*/) : CDialog(CIpRegDemoDlg::IDD, pParent) { m_log=FALSE; m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_runatstart=FALSE; CString sPath; //得到可执行程序的完整路径和程序名 GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH); sPath.ReleaseBuffer (); g_hikreg.RegSetAppPath(sPath); } void CIpRegDemoDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX, IDC_LIST_DEVICE, m_deviceList); DDX_Control(pDX, IDC_BUTTON_START, m_btnStart); DDX_Control(pDX, IDC_BUTTON_STOP, m_btnStop); DDX_Control(pDX, IDC_BUTTON_CONFIG, m_btnConfig); } BEGIN_MESSAGE_MAP(CIpRegDemoDlg, CDialog) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_MESSAGE(WM_NOTIFYICON, OnNotifyIcon) //}}AFX_MSG_MAP ON_COMMAND(ID_CONTROLPANEL, OnControlPanel) ON_COMMAND(ID_START, OnStart) ON_COMMAND(ID_STOP, OnStop) ON_COMMAND(ID_ABOUT, OnAbout) ON_COMMAND(ID_EXIT, OnExit) ON_BN_CLICKED(IDC_BUTTON_START, OnBnClickedButtonStart) ON_BN_CLICKED(IDC_BUTTON_STOP, OnBnClickedButtonStop) ON_WM_TIMER() ON_BN_CLICKED(IDC_BUTTON_CONFIG, OnBnClickedButtonConfig) END_MESSAGE_MAP() int CBRegisterDevice(bool badd,const char* deviceip,const char* devicename,const char* deviceid, const char* netcardid, unsigned short port) { struct callbackinfo *pinfo=new struct callbackinfo; memset(pinfo->deviceip,0,32); memset(pinfo->devicename,0,32); memset(pinfo->deviceid,0,100); memset(pinfo->netcardid,0,64); //TRACE("BADD=%d ,deviceip=%s,devicename%s,deviceid=%s-->\nnetcardid=%s,port=%d\n",\ badd,deviceip,devicename,deviceid,netcardid,port); pinfo->badd=badd; strcpy(pinfo->deviceip,deviceip); strcpy(pinfo->devicename,devicename); strcpy(pinfo->deviceid,deviceid); strcpy(pinfo->netcardid,netcardid); pinfo->port=port; PostMessage(m_hwnd,WM_CALLBACK,(WPARAM)pinfo,0); return 0; } char *g_IPAddr=new char[32]; int CBGetDeviceAddrInfo(int command,int *Result, char** ipaddr,char *deviceid,int idlen,\ char*devicename, int devicelen ) { int count=g_list->GetItemCount(); *ipaddr=g_IPAddr; // TRACE("get a item:deviceid=%s devicename=%s\n",deviceid,devicename); int result=1; for(int i = 0; i< count; i++) { if(deviceid == NULL) { result=1; break; } if(strncmp(deviceid,(LPCTSTR)g_list->GetItemText(i, 2),idlen) == 0) { *Result=0; //TRACE("对应的ipaddr=%s\n",g_list->GetItemText(i,0).GetBuffer(0)); strcpy(*ipaddr,g_list->GetItemText(i,0).GetBuffer(0)); TRACE("get a item by deviceid:ipaddr=%s\n",*ipaddr); result=0; break; } } if (result==1) { for(int i = 0; i< count; i++) { if(devicename==NULL) { result=1; break; } if(strncmp(devicename,(LPCTSTR)g_list->GetItemText(i,1),devicelen) == 0) { *Result=0; strcpy(*ipaddr,(LPCTSTR)g_list->GetItemText(i,0).GetBuffer(0)); TRACE("get a item by devicename:ipaddr=%s\n",*ipaddr); result=0; break; } } } if (result==1) { TRACE("there no such item:devicename=%s,deviceid=%s\n",devicename,deviceid); *Result=1; *ipaddr=0; } return 0; } // CIpRegDemoDlg 消息处理程序 BOOL CIpRegDemoDlg::OnInitDialog() { CDialog::OnInitDialog(); // 将\“关于...\”菜单项添加到系统菜单中。 // IDM_ABOUTBOX 必须在系统命令范围内。 ASSERT((IDM_ABOUTBOX & 0xFFF0) == IDM_ABOUTBOX); ASSERT(IDM_ABOUTBOX < 0xF000); CMenu* pSysMenu = GetSystemMenu(FALSE); if (pSysMenu != NULL) { CString strAboutMenu; strAboutMenu.LoadString(IDS_ABOUTBOX); if (!strAboutMenu.IsEmpty()) { pSysMenu->AppendMenu(MF_SEPARATOR); pSysMenu->AppendMenu(MF_STRING, IDM_ABOUTBOX, strAboutMenu); } } // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动 // 执行此操作 SetIcon(m_hIcon, TRUE); // 设置大图标 SetIcon(m_hIcon, FALSE); // 设置小图标 // TODO: 在此添加额外的初始化代码 m_btnStart.SetIcon(IDI_START,32,32); m_btnStart.SetColor(CButtonST::BTNST_COLOR_FG_OUT, RGB(0,0,0)); m_btnStart.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(255,0,0)); m_btnStart.SetAlign(CButtonST::ST_ALIGN_HORIZ); m_btnStart.DrawBorder(FALSE); m_btnStop.SetIcon(IDI_STOP,32,32); m_btnStop.SetColor(CButtonST::BTNST_COLOR_FG_OUT, RGB(0,0,0)); m_btnStop.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(255,0,0)); m_btnStop.SetAlign(CButtonST::ST_ALIGN_HORIZ); m_btnStop.DrawBorder(FALSE); m_btnStop.SetIcon(IDI_STOP_D,32,32); GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE); m_btnConfig.SetIcon(IDI_CONFIG,32,32); m_btnConfig.SetColor(CButtonST::BTNST_COLOR_FG_OUT, RGB(0,0,0)); m_btnConfig.SetColor(CButtonST::BTNST_COLOR_FG_IN, RGB(255,0,0)); m_btnConfig.SetAlign(CButtonST::ST_ALIGN_HORIZ); m_btnConfig.DrawBorder(FALSE); //时钟显示初始化 tm *time; CTime ct = CTime::GetCurrentTime(); time = ct.GetLocalTm(NULL); m_secAngle = PI*(time->tm_sec)/30.0; m_minAngle = PI*(time->tm_min + time->tm_sec/60.0)/30.0; m_hourAngle = PI*(time->tm_hour + time->tm_min/60.0)/6.0; m_deviceList.DeleteAllItems(); m_deviceList.DeleteColumn(0); m_deviceList.InsertColumn(0,"IP地址",LVCFMT_CENTER,90,-1); m_deviceList.InsertColumn(1,"设备名称",LVCFMT_CENTER,80,-1); m_deviceList.InsertColumn(2,"序列号",LVCFMT_CENTER,143,-1); m_deviceList.InsertColumn(3,"MAC地址",LVCFMT_CENTER,116,-1); m_deviceList.InsertColumn(4,"端口号",LVCFMT_CENTER,50,-1); m_deviceList.SetExtendedStyle(m_deviceList.GetExtendedStyle()|LVS_EX_GRIDLINES|LVS_EX_FULLROWSELECT); CRect rc; GetDlgItem(IDC_CLOCK)->GetClientRect(&rc); m_clock.ClockStart(this->m_hWnd, 1, rc); m_hwnd=this->GetSafeHwnd(); g_list=&(this->m_deviceList); SetNewConnectionCallBack(CBRegisterDevice); SetGetDeviceIdCallBack(CBGetDeviceAddrInfo); //ModifyStyleEx(WS_EX_APPWINDOW,WS_EX_TOOLWINDOW);//从任务栏中去掉 WS_EX_WINDOWEDGE WS_EX_TOOLWINDOW if (GetConfig(&m_log, &m_runatstart)==0) { if ( m_runatstart) { OnMini(); WINDOWPLACEMENT wndpl; WINDOWPLACEMENT *pwndpl; pwndpl = &wndpl; GetWindowPlacement(pwndpl); pwndpl->showCmd = SW_HIDE; //实现窗口最小化SW_SHOWMINMIZED SetWindowPlacement(pwndpl); pwndpl->showCmd = SW_MINIMIZE; //实现窗口最小化SW_SHOWMINMIZED SetWindowPlacement(pwndpl); OnBnClickedButtonStart(); } if (m_log) { LogToList(); } } return TRUE; // 除非设置了控件的焦点,否则返回 TRUE } void CIpRegDemoDlg::LogToList() { string strItem; string strRemain; //string strTemp; string strLog; int pos; char item[512]; char deviceip[32]; char devicename[32]; char deviceid[100]; char netcardid[64]; char strport[10]; memset(item,0,512); FILE *fpLog; //,*fpConfig //char line[100]; char path[100]; GetCurrentPath(path); strcat(path,"\\ConfigLog.txt"); //if ( (fpConfig = fopen(path, "r"))== NULL) //{ // TRACE("Open ConfigLog.txt error\n"); // return ; //} //fgets(line,100, fpConfig); //strTemp = string(line); //pos = strTemp.find_first_of('\t'); //if(pos == string::npos) // return ; //strLog =strTemp.substr(pos+1,pos+4); //TRACE("CIpRegDemoDlg::LogToList->strLog=%s\n",strTemp.substr(pos+1,pos+4).c_str()); //if (strncmp("yes",strLog.c_str(),3)== 0) //{ // m_log=TRUE; //} //else //{ // m_log=FALSE; //} //fclose(fpConfig); //if (m_log == TRUE) //{ memset(path, 0, 100); GetCurrentPath(path); strcat(path,"\\devicelog.txt"); TRACE(" LogToList PATH=%s\n",path); if ( (fpLog=fopen(path, "r")) == NULL) { TRACE("OPEN devicelog.txt error\n"); return; } m_deviceList.DeleteAllItems(); for(int i = 0; i< 1000; i++) { if(fgets(item,512,fpLog)==NULL) { TRACE("There are %d items in log \n", i); break; } strItem=string(item); pos=strItem.find_first_of('\t'); if(pos == string::npos) return ; strRemain= strItem.substr(pos+1); pos=strRemain.find_first_of('\t'); if(pos == string::npos) return ; strcpy(deviceip,strRemain.substr(0,pos).c_str()); strRemain= strRemain.substr(pos+1); pos=strRemain.find_first_of('\t'); if(pos == string::npos) return ; strcpy(devicename,strRemain.substr(0,pos).c_str()); strRemain= strRemain.substr(pos+1); pos=strRemain.find_first_of('\t'); if(pos == string::npos) return ; strcpy(deviceid,strRemain.substr(0,pos).c_str()); strRemain= strRemain.substr(pos+1); pos=strRemain.find_first_of('\t'); if(pos == string::npos) return ; strcpy(netcardid,strRemain.substr(0,pos).c_str()); strRemain= strRemain.substr(pos+1); pos=strRemain.find_first_of('\n'); if(pos == string::npos) return ; strcpy(strport,strRemain.substr(0,pos).c_str()); //strRemain= strRemain.substr(pos+1); TRACE("%s\t%s\t%s\t%s\t%s\n",deviceip, devicename, deviceid, netcardid, strport); m_deviceList.InsertItem(i,deviceip); m_deviceList.SetItemText(i,1,devicename); m_deviceList.SetItemText(i,2,deviceid); m_deviceList.SetItemText(i,3,netcardid); m_deviceList.SetItemText(i,4,strport); } fclose(fpLog); //} return; } void CIpRegDemoDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } else if ((nID & 0xFFF0)==SC_MINIMIZE) { OnMini(); } else { CDialog::OnSysCommand(nID, lParam); } } // 如果向对话框添加最小化按钮,则需要下面的代码 // 来绘制该图标。对于使用文档/视图模型的 MFC 应用程序, // 这将由框架自动完成。 void CIpRegDemoDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // 用于绘制的设备上下文 SendMessage(WM_ICONERASEBKGND, reinterpret_cast (dc.GetSafeHdc()), 0); // 使图标在工作矩形中居中 int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; // 绘制图标 dc.DrawIcon(x, y, m_hIcon); } else { //绘制时钟图案 CPaintDC dc(this); CDC *pDC = GetDlgItem(IDC_CLOCK)->GetDC(); m_clock.ClockDraw(pDC); ReleaseDC(pDC); CDialog::OnPaint(); } } //当用户拖动最小化窗口时系统调用此函数取得光标显示。 HCURSOR CIpRegDemoDlg::OnQueryDragIcon() { return static_cast (m_hIcon); } LRESULT CIpRegDemoDlg::OnNotifyIcon(WPARAM wParam, LPARAM lParam) { UINT uMouseMsg = (UINT)lParam; switch(uMouseMsg) { case WM_LBUTTONDBLCLK: if (IsWindowVisible()) { ShowWindow(SW_HIDE); } else { ShowWindow(SW_SHOWNORMAL); this->SetForegroundWindow(); } break; case WM_RBUTTONUP: { CMenu menuTray; menuTray.LoadMenu(IDR_ICONMENU); CPoint point; GetCursorPos(&point); SetForegroundWindow(); if(GetDlgItem(IDC_BUTTON_START)->IsWindowEnabled()) menuTray.GetSubMenu(0)->EnableMenuItem(ID_START,MF_ENABLED); else menuTray.GetSubMenu(0)->EnableMenuItem(ID_START,MF_GRAYED); if(GetDlgItem(IDC_BUTTON_STOP)->IsWindowEnabled()) menuTray.GetSubMenu(0)->EnableMenuItem(ID_STOP,MF_ENABLED); else menuTray.GetSubMenu(0)->EnableMenuItem(ID_STOP,MF_GRAYED); menuTray.GetSubMenu(0)->TrackPopupMenu(TPM_RIGHTALIGN |TPM_RIGHTBUTTON, point.x, point.y, this); menuTray.DestroyMenu(); } break; default: break; } return 0; } void CIpRegDemoDlg::OnMini(void) { ShowWindow(SW_HIDE); m_tnid.cbSize = sizeof(NOTIFYICONDATA); m_tnid.hWnd = this->GetSafeHwnd(); m_tnid.uID = IDI_MINICON; m_tnid.uFlags = NIF_MESSAGE | NIF_ICON | NIF_TIP; m_tnid.uCallbackMessage = WM_NOTIFYICON; strcpy(m_tnid.szTip, "IPServer"); m_tnid.hIcon = AfxGetApp()->LoadIcon(IDI_MINICON); Shell_NotifyIcon(NIM_ADD, &m_tnid); } void CIpRegDemoDlg::OnBnClickedButtonStart() { // TODO: Add your control notification handler code here UpdateData(true); m_btnStart.SetIcon(IDI_START_D,32,32); m_btnStop.SetIcon(IDI_STOP,32,32); GetDlgItem(IDC_BUTTON_START)->EnableWindow(FALSE); GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(TRUE); StartServer(); RunServer(); if (m_log) { LogToList(); } return; } void CIpRegDemoDlg::OnBnClickedButtonStop() { // TODO: Add your control notification handler code here StopServer(); m_btnStart.SetIcon(IDI_START,32,32); m_btnStop.SetIcon(IDI_STOP_D,32,32); GetDlgItem(IDC_BUTTON_START)->EnableWindow(TRUE); GetDlgItem(IDC_BUTTON_STOP)->EnableWindow(FALSE); m_deviceList.DeleteAllItems(); } LRESULT CIpRegDemoDlg::WindowProc(UINT message, WPARAM wParam, LPARAM lParam) { // TODO: 在此添加专用代码和/或调用基类 if(message==WM_CALLBACK) { TRACE("进入WM_CALLBACK\n"); struct callbackinfo *pinfo=(struct callbackinfo *)wParam; try { m_drawlist.updateCommandToList(pinfo->badd,pinfo->deviceip,pinfo->devicename,\ pinfo->deviceid,pinfo->netcardid,pinfo->port,&m_deviceList,m_log); delete pinfo; } catch(...) { TRACE("There is some exception on WindowProc!\n"); } } return CDialog::WindowProc(message, wParam, lParam); } void CIpRegDemoDlg::OnTimer(UINT nIDEvent) { // TODO: Add your message handler code here and/or call default if (nIDEvent==1) { m_clock.CalculateHandAngle(); CWnd * wnd = GetDlgItem(IDC_CLOCK); CRect rc; wnd->GetWindowRect(&rc); ScreenToClient(&rc); InvalidateRect(&rc); } CDialog::OnTimer(nIDEvent); } void CIpRegDemoDlg::OnCancel() { OnMini(); } void CIpRegDemoDlg::OnControlPanel() { // TODO: 在此添加命令处理程序代码 ShowWindow(SW_SHOW); } void CIpRegDemoDlg::OnStart() { // TODO: 在此添加命令处理程序代码 OnBnClickedButtonStart(); } void CIpRegDemoDlg::OnStop() { // TODO: 在此添加命令处理程序代码 OnBnClickedButtonStop(); } void CIpRegDemoDlg::OnAbout() { // TODO: 在此添加命令处理程序代码 CAboutDlg dlgAbout; dlgAbout.DoModal(); } void CIpRegDemoDlg::OnExit() { StopServer(); m_tnid.cbSize = sizeof(NOTIFYICONDATA); m_tnid.hWnd = this->GetSafeHwnd(); Shell_NotifyIcon(NIM_DELETE, &m_tnid); m_clock.ClockStop(); delete [] g_IPAddr; CDialog::OnCancel(); } void CIpRegDemoDlg::OnBnClickedButtonConfig() { // TODO: Add your control notification handler code here CConfigDlg m_ConfigDlg; if (IDOK==m_ConfigDlg.DoModal()) { FILE *fpConfig; TRACE("set :m_runatstart=%d,m_log=%d\n",m_ConfigDlg.m_runatstart,m_ConfigDlg.m_log); HRESULT hr = S_OK; CRegKey rk_run; m_log=m_ConfigDlg.m_log; char path[100]; memset(path, 0, 100); GetCurrentPath(path); strcat(path,"\\ConfigLog.txt"); if ( (fpConfig = fopen(path, "w+"))== NULL) { TRACE("Open ConfigLog.txt error\n"); return ; } if (m_ConfigDlg.m_log ) //&& m_bServerStart { fputs("log device info?\tyes\n",fpConfig); TRACE("配置的时候加载"); LogToList(); } else { fputs("log device info?\tno\n",fpConfig); } if(m_ConfigDlg.m_runatstart)//如果是RunAtStart,则写注册表 { CString spath; if(SUCCEEDED(hr = rk_run.Open( HKEY_LOCAL_MACHINE, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Run"),KEY_ALL_ACCESS))) { g_hikreg.RegGetAppPath(&spath); rk_run.SetValue(spath, _T("ipserverautorun")); } fputs("run at begining?\tyes\n",fpConfig); } else//如果不是RunAtStart,则删除注册表 { if(SUCCEEDED(hr = rk_run.Open( HKEY_LOCAL_MACHINE, _T("Software\\Microsoft\\Windows\\CurrentVersion\\Run"),KEY_ALL_ACCESS))) { rk_run.DeleteValue(_T("ipserverautorun")); } fputs("run at begining?\tno\n",fpConfig); } fclose(fpConfig); } }