//Download by http://www.NewXing.com // dDlg.cpp : implementation file // #include "stdafx.h" #include "d.h" #include "dDlg.h" #include #pragma comment(lib,"winmm.lib") #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif UINT SoundThread(LPVOID) { PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetResourceHandle(),SND_RESOURCE|SND_PURGE|SND_NODEFAULT); return 0; } ///////////////////////////////////////////////////////////////////////////// // CAboutDlg dialog used for App About class CAboutDlg : public CDialog { public: CAboutDlg(); // Dialog Data //{{AFX_DATA(CAboutDlg) enum { IDD = IDD_ABOUTBOX }; //}}AFX_DATA // ClassWizard generated virtual function overrides //{{AFX_VIRTUAL(CAboutDlg) protected: virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV support //}}AFX_VIRTUAL // Implementation protected: //{{AFX_MSG(CAboutDlg) //}}AFX_MSG DECLARE_MESSAGE_MAP() }; CAboutDlg::CAboutDlg() : CDialog(CAboutDlg::IDD) { //{{AFX_DATA_INIT(CAboutDlg) //}}AFX_DATA_INIT } void CAboutDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CAboutDlg) //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CAboutDlg, CDialog) //{{AFX_MSG_MAP(CAboutDlg) // No message handlers //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDDlg dialog CDDlg::CDDlg(CWnd* pParent /*=NULL*/) : CDialog(CDDlg::IDD, pParent) { //{{AFX_DATA_INIT(CDDlg) m_bAlwaysOnTop =(::GetPrivateProfileInt("Settings","AlwaysOnTop",0,".\\Settings.ini")==0 ?false:true); m_bAutoRun=(::GetPrivateProfileInt("Settings","AutoRun",0,".\\Settings.ini")==0 ?false:true); m_bMinimized=(::GetPrivateProfileInt("Settings","Minimized",0,".\\Settings.ini")==0 ?false:true); m_bAutoStart = (::GetPrivateProfileInt("Settings","AutoStart",0,".\\Settings.ini")==0 ?false:true); //}}AFX_DATA_INIT // Note that LoadIcon does not require a subsequent DestroyIcon in Win32 m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME); m_bAddNew0=(::GetPrivateProfileInt("Selections","m_bAddNew",0,".\\Settings.ini")==0 ?false:true); m_bDel0=(::GetPrivateProfileInt("Selections","m_bDel",0,".\\Settings.ini")==0 ?false:true); m_bRename0=(::GetPrivateProfileInt("Selections","m_bRename",0,".\\Settings.ini")==0 ?false:true); m_bModify0=(::GetPrivateProfileInt("Selections","m_bModify",0,".\\Settings.ini")==0 ?false:true); m_bOther0=(::GetPrivateProfileInt("Selections","m_bOther",0,".\\Settings.ini")==0 ?false:true); /*------------------------------------------------------*/ char buf[MAX_PATH]; ::GetPrivateProfileString("Settings", "监视目录", "", buf, MAX_PATH,".\\Settings.ini"); strcpy((LPTSTR)(LPCTSTR)m_strWatchedDir,buf); /*------------------------------------------------------*/ m_hThread=NULL; hDir=INVALID_HANDLE_VALUE ; m_i=0; m_szi=new char[MAX_PATH]; itoa(m_i,m_szi,10); } CDDlg::~CDDlg() { /*----------------------释放资源------------------------------------*/ if(m_hThread !=NULL) { ::TerminateThread(m_hThread, 0 ); m_hThread = NULL; } if(hDir !=INVALID_HANDLE_VALUE) { CloseHandle( hDir ); hDir = INVALID_HANDLE_VALUE; } } /*----------------------线程函数------------------------------------*/ DWORD WINAPI CDDlg::ThreadProc( LPVOID lParam ) //线程函数 { CDDlg* obj = (CDDlg*)lParam; //参数转化 obj->hDir = CreateFile( //打开目录,得到目录的句柄 obj->m_strWatchedDir, GENERIC_READ|GENERIC_WRITE, FILE_SHARE_READ|FILE_SHARE_WRITE|FILE_SHARE_DELETE, NULL, OPEN_EXISTING, FILE_FLAG_BACKUP_SEMANTICS, NULL ); if(obj->hDir ==INVALID_HANDLE_VALUE ) return false; char buf[(sizeof(FILE_NOTIFY_INFORMATION)+MAX_PATH)*2]; FILE_NOTIFY_INFORMATION* pNotify=(FILE_NOTIFY_INFORMATION*)buf; DWORD dwBytesReturned; while(true) { if( ::ReadDirectoryChangesW( obj->hDir, pNotify, sizeof(buf), true, FILE_NOTIFY_CHANGE_FILE_NAME| FILE_NOTIFY_CHANGE_DIR_NAME| FILE_NOTIFY_CHANGE_ATTRIBUTES| FILE_NOTIFY_CHANGE_SIZE| FILE_NOTIFY_CHANGE_LAST_WRITE| FILE_NOTIFY_CHANGE_LAST_ACCESS| FILE_NOTIFY_CHANGE_CREATION| FILE_NOTIFY_CHANGE_SECURITY, &dwBytesReturned, NULL, NULL ) ) { char tmp[MAX_PATH], str1[MAX_PATH], str2[MAX_PATH]; memset( tmp, 0, sizeof(tmp) ); //ZeroMemory() WideCharToMultiByte( CP_ACP,0,pNotify->FileName,pNotify->FileNameLength/2,tmp,99,NULL,NULL ); strcpy( str1, tmp ); if(pNotify->NextEntryOffset !=0 ) { PFILE_NOTIFY_INFORMATION p = (PFILE_NOTIFY_INFORMATION)((char*)pNotify+pNotify->NextEntryOffset); memset( tmp, 0, sizeof(tmp) ); WideCharToMultiByte( CP_ACP,0,p->FileName,p->FileNameLength/2,tmp,99,NULL,NULL ); strcpy( str2, tmp ); } switch(pNotify->Action) { case FILE_ACTION_ADDED: if(obj->m_bAddNew0) { CTime tt=CTime::GetCurrentTime(); CString strTT; strTT.Format("%d:%d:%d",tt.GetHour(),tt.GetMinute(),tt.GetSecond()); obj->m_list.InsertItem(0,obj->m_szi); obj->m_list.SetItemText(0,2,"添加了新文件"); obj->m_list.SetItemText(0,3,str1); obj->m_list.SetItemText(0,1,strTT); // PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetResourceHandle(),SND_RESOURCE|SND_PURGE|SND_NODEFAULT); } break; case FILE_ACTION_REMOVED: if(obj->m_bDel0) { CTime tt=CTime::GetCurrentTime(); CString strTT; strTT.Format("%d:%d:%d",tt.GetHour(),tt.GetMinute(),tt.GetSecond()); obj->m_list.InsertItem(0,obj->m_szi); obj->m_list.SetItemText(0,2,"删除了文件"); obj->m_list.SetItemText(0,3,str1); obj->m_list.SetItemText(0,1,strTT); // PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetResourceHandle(),SND_RESOURCE|SND_PURGE|SND_NODEFAULT); } break; case FILE_ACTION_RENAMED_NEW_NAME: if(obj->m_bRename0) { CTime tt=CTime::GetCurrentTime(); CString strTT; strTT.Format("%d:%d:%d",tt.GetHour(),tt.GetMinute(),tt.GetSecond()); obj->m_list.InsertItem(0,obj->m_szi); obj->m_list.SetItemText(0,2,"重命名了文件"); strcat(str1,"->"); obj->m_list.SetItemText(0,3,strcat(str1,str2)); obj->m_list.SetItemText(0,1,strTT); // PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetResourceHandle(),SND_RESOURCE|SND_PURGE|SND_NODEFAULT); } break; case FILE_ACTION_RENAMED_OLD_NAME: if(obj->m_bRename0) { CTime tt=CTime::GetCurrentTime(); CString strTT; strTT.Format("%d:%d:%d",tt.GetHour(),tt.GetMinute(),tt.GetSecond()); obj->m_list.InsertItem(0,obj->m_szi); obj->m_list.SetItemText(0,2,"重命名了文件"); strcat(str1," 改名为 "); obj->m_list.SetItemText(0,3,strcat(str1,str2)); obj->m_list.SetItemText(0,1,strTT); // PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetResourceHandle(),SND_RESOURCE|SND_PURGE|SND_NODEFAULT); } break; case FILE_ACTION_MODIFIED: if(obj->m_bModify0) { CTime tt=CTime::GetCurrentTime(); CString strTT; strTT.Format("%d:%d:%d",tt.GetHour(),tt.GetMinute(),tt.GetSecond()); obj->m_list.InsertItem(0,obj->m_szi); obj->m_list.SetItemText(0,2,"修改了文件"); obj->m_list.SetItemText(0,3,str1); obj->m_list.SetItemText(0,1,strTT); // PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetResourceHandle(),SND_RESOURCE|SND_PURGE|SND_NODEFAULT); } break; default: if(obj->m_bOther0) { CTime tt=CTime::GetCurrentTime(); CString strTT; strTT.Format("%d:%d:%d",tt.GetHour(),tt.GetMinute(),tt.GetSecond()); obj->m_list.InsertItem(0,obj->m_szi); obj->m_list.SetItemText(0,2,"未知变化"); obj->m_list.SetItemText(0,3,""); obj->m_list.SetItemText(0,1,strTT); // PlaySound(MAKEINTRESOURCE(IDR_WAVE1),AfxGetResourceHandle(),SND_RESOURCE|SND_PURGE|SND_NODEFAULT); } break; } obj->m_i++; itoa(obj->m_i,obj->m_szi,10); //AfxBeginThread(SoundThread,0); } else break; } return 0; } /*----------------------线程函数------------------------------------*/ void CDDlg::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); //{{AFX_DATA_MAP(CDDlg) DDX_Control(pDX, IDC_LIST1, m_list); DDX_Check(pDX, IDC_BTN_ALWAYS_ON_TOP, m_bAlwaysOnTop); DDX_Check(pDX, IDC_CHECK_AUTORUN, m_bAutoRun); DDX_Check(pDX, IDC_CHECK_MINIMIZED, m_bMinimized); DDX_Check(pDX, IDC_NOSOUND, m_bAutoStart); //}}AFX_DATA_MAP } BEGIN_MESSAGE_MAP(CDDlg, CDialog) //{{AFX_MSG_MAP(CDDlg) ON_WM_SYSCOMMAND() ON_WM_PAINT() ON_WM_QUERYDRAGICON() ON_BN_CLICKED(IDC_START, OnStart) ON_BN_CLICKED(IDC_CLEAR, OnClear) ON_BN_CLICKED(IDC_BTN_ALWAYS_ON_TOP, OnBtnAlwaysOnTop) ON_BN_CLICKED(IDC_ABOUT, OnAbout) ON_BN_CLICKED(IDC_CHECK_MINIMIZED, OnCheckMinimized) ON_BN_CLICKED(IDC_CHECK_AUTORUN, OnCheckAutorun) ON_MESSAGE(WM_HOTKEY,OnHotKey) ON_BN_CLICKED(IDC_SELECT_DIR, OnSelectDir) ON_WM_CTLCOLOR() ON_WM_LBUTTONDOWN() ON_BN_CLICKED(IDC_STOP, OnStop) ON_BN_CLICKED(IDC_SELECTIONS, OnSelections) ON_BN_CLICKED(IDC_NOSOUND, OnNosound) ON_NOTIFY(NM_DBLCLK, IDC_LIST1, OnDblclkList1) //}}AFX_MSG_MAP END_MESSAGE_MAP() ///////////////////////////////////////////////////////////////////////////// // CDDlg message handlers BOOL CDDlg::OnInitDialog() { CDialog::OnInitDialog(); // Add "About..." menu item to system menu. // IDM_ABOUTBOX must be in the system command range. 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); } } // Set the icon for this dialog. The framework does this automatically // when the application's main window is not a dialog SetIcon(m_hIcon, TRUE); // Set big icon SetIcon(m_hIcon, FALSE); // Set small icon m_list.ModifyStyle(LVS_TYPEMASK,LVS_REPORT); m_list.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_FLATSB|LVS_EX_TWOCLICKACTIVATE |LVS_EX_GRIDLINES); m_list.InsertColumn(0,"数量",LVCFMT_LEFT,40); m_list.InsertColumn(1,"时间",LVCFMT_LEFT,80); m_list.InsertColumn(2,"类型",LVCFMT_LEFT,100); m_list.InsertColumn(3,"变化的内容",LVCFMT_LEFT,500); LOGFONT lf; ::ZeroMemory(&lf,sizeof(lf)); //API函数,它将一块内存清零 lf.lfHeight =90; lf.lfWeight =FW_NORMAL; //, FW_NORMAL常规 FW_BOLD;粗体 lf.lfItalic =false; ::lstrcpy(lf.lfFaceName ,"Verdana"); m_font.CreatePointFontIndirect(&lf); GetDlgItem(IDC_STATE)->SetFont(&m_font); CString str; str.Format("你选择的监视目录为 %s",m_strWatchedDir); GetDlgItem(IDC_STATE)->SetWindowText(str); GetDlgItem(IDC_STOP)->EnableWindow(false); if(m_bAlwaysOnTop) OnBtnAlwaysOnTop(); if(this->m_bMinimized) PostMessage(WM_SYSCOMMAND, SC_MINIMIZE, 0); if(this->m_bAutoStart) this->OnStart(); ::RegisterHotKey(m_hWnd,199,MOD_ALT,'Z'); return TRUE; } void CDDlg::OnSysCommand(UINT nID, LPARAM lParam) { if ((nID & 0xFFF0) == IDM_ABOUTBOX) { CAboutDlg dlgAbout; dlgAbout.DoModal(); } if(nID==SC_MINIMIZE) { ShowWindow(SW_HIDE); } else { CDialog::OnSysCommand(nID, lParam); } } // If you add a minimize button to your dialog, you will need the code below // to draw the icon. For MFC applications using the document/view model, // this is automatically done for you by the framework. void CDDlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle 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; // Draw the icon dc.DrawIcon(x, y, m_hIcon); } else { CDialog::OnPaint(); } } // The system calls this to obtain the cursor to display while the user drags // the minimized window. HCURSOR CDDlg::OnQueryDragIcon() { return (HCURSOR) m_hIcon; } BOOL CDDlg::StartWatch(CString path) { m_strWatchedDir = path; DWORD ThreadId; //创建一个新线程用于监视 m_hThread=::CreateThread(NULL,0,ThreadProc,this,0,&ThreadId ); return NULL!=m_hThread; } void CDDlg::OnSelectDir() { CBrowseFolder Dlg; if(Dlg.DoModal(this,NULL)==IDOK) { m_strWatchedDir=Dlg.GetDirPath(); ::WritePrivateProfileString("Settings", "监视目录", m_strWatchedDir, ".\\Settings.ini"); GetDlgItem(IDC_STATE)->SetWindowText("你选择了监视 "+m_strWatchedDir); } } void CDDlg::OnStart() { this->StartWatch(m_strWatchedDir); GetDlgItem(IDC_STOP)->EnableWindow(true); GetDlgItem(IDC_START)->EnableWindow(false); GetDlgItem(IDC_SELECT_DIR)->EnableWindow(false); GetDlgItem(IDC_STATE)->SetWindowText("正在监视... "+m_strWatchedDir); } void CDDlg::OnStop() { GetDlgItem(IDC_STATE)->SetWindowText("停止了监视"+m_strWatchedDir); if(m_hThread !=NULL) { ::TerminateThread(m_hThread, 0 ); m_hThread = NULL; } if(hDir !=INVALID_HANDLE_VALUE) { CloseHandle( hDir ); hDir = INVALID_HANDLE_VALUE; } GetDlgItem(IDC_STOP)->EnableWindow(false); GetDlgItem(IDC_START)->EnableWindow(true); GetDlgItem(IDC_SELECT_DIR)->EnableWindow(true); } void CDDlg::OnClear() { PlaySound(MAKEINTRESOURCE(IDR_WAVE2),AfxGetResourceHandle(),SND_RESOURCE|SND_PURGE|SND_NODEFAULT); m_list.DeleteAllItems(); } void CDDlg::OnBtnAlwaysOnTop() { UpdateData(); if (m_bAlwaysOnTop) { SetWindowPos(&wndTopMost, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE | WS_EX_TOPMOST); ::WritePrivateProfileString("Settings","AlwaysOnTop",m_bAlwaysOnTop? "1":"0",".\\Settings.ini"); } else { ::SetWindowPos(GetSafeHwnd(), HWND_NOTOPMOST, 0, 0, 0, 0, SWP_NOMOVE | SWP_NOSIZE); ::WritePrivateProfileString("Settings","AlwaysOnTop",m_bAlwaysOnTop? "1":"0",".\\Settings.ini"); } } void CDDlg::OnAbout() { //CAboutDlg dd; CLogoDlg dd; dd.DoModal(); } void CDDlg::OnNosound() { UpdateData(true); ::WritePrivateProfileString("Settings","AutoStart",m_bAutoStart? "1":"0",".\\Settings.ini"); } void CDDlg::OnCheckMinimized() { UpdateData(true); ::WritePrivateProfileString("Settings","Minimized",m_bMinimized? "1":"0",".\\Settings.ini"); } void CDDlg::OnCheckAutorun() { UpdateData(true); const TCHAR gcszAutoRunKey[]= _T( "Software\\microsoft\\windows\\currentversion\\run" ); const TCHAR gcszWindowClass[] = _T("关驱控制");//设置开机程序自启动键值位置和其下新建子键值(可设为程序名) HKEY hKey; LONG lRet, lRet2; DWORD dwLength, dwDataType; TCHAR szItemValue[MAX_PATH], szPrevValue[MAX_PATH]; TCHAR szBuffer[MAX_PATH]; GetModuleFileName( NULL, szItemValue, MAX_PATH ); // 得到程序全路径名 //MessageBox(szItemValue); lRet = RegOpenKeyEx( HKEY_LOCAL_MACHINE, gcszAutoRunKey,0, KEY_READ | KEY_WRITE, &hKey ); if( lRet != ERROR_SUCCESS ) // 打开注册表键 { MessageBox("设置自动启动失败,请检查注册表是否被禁用!","使闹钟",MB_OK| MB_ICONEXCLAMATION); } dwLength = sizeof( szBuffer ); lRet = RegQueryValueEx( hKey, gcszWindowClass,NULL, &dwDataType, (LPBYTE)szBuffer, &dwLength ); // 查询AutoRun项目是否存在 if( m_bAutoRun ) // 添加 { ::WritePrivateProfileString("Settings","AutoRun",m_bAutoRun? "1":"0",".\\Settings.ini"); if( lRet != ERROR_SUCCESS ) // AutoRun项目不存在 lRet2 = RegSetValueEx( hKey, gcszWindowClass,0, REG_SZ, (LPBYTE)szItemValue, strlen( szItemValue ) ); else // 存在, 比较二者是否相同 { dwLength = sizeof( szPrevValue ); lRet2 = RegQueryValueEx( hKey, gcszWindowClass,0, &dwDataType,(LPBYTE)szPrevValue, &dwLength ); if( lstrcmp( szItemValue, szPrevValue ) ) // 不相同则替换 { lRet2 = RegDeleteValue( hKey, gcszWindowClass ); lRet2 = RegSetValueEx( hKey, gcszWindowClass,0, REG_SZ,(LPBYTE)szItemValue, strlen( szItemValue ) ); } } } else // 删除 { if( lRet == ERROR_SUCCESS ) lRet2 = RegDeleteValue( hKey, gcszWindowClass ); // AutoRun项目已存在则删除 ::WritePrivateProfileString("Settings","AutoRun",m_bAutoRun? "1":"0",".\\Settings.ini"); } RegCloseKey( hKey ); // 关闭注册表键 if( lRet2 != ERROR_SUCCESS ) {}// MessageBox("设置自动启动失败,请检查注册表是否被禁用!","使闹钟",MB_OK| MB_ICONEXCLAMATION); } LRESULT CDDlg::OnHotKey(WPARAM wp,LPARAM lp) { if(wp==199) { if(IsWindowVisible()) ShowWindow(SW_HIDE); else ShowWindow(SW_SHOWNORMAL); } return 0; } BOOL CDDlg::DestroyWindow() { ::UnregisterHotKey(m_hWnd,199); return CDialog::DestroyWindow(); } BOOL CDDlg::PreTranslateMessage(MSG* pMsg) { if (pMsg->message==WM_KEYDOWN) { switch (pMsg->wParam) { case VK_ESCAPE: ShowWindow(SW_HIDE); return true; break; case VK_RETURN: return true; break; default: break; } } return CDialog::PreTranslateMessage(pMsg); } HBRUSH CDDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); if(pWnd->GetDlgCtrlID()==IDC_STATE) pDC->SetTextColor(RGB(0,0,255)); // TODO: Return a different brush if the default is not desired return hbr; } void CDDlg::OnLButtonDown(UINT nFlags, CPoint point) { ReleaseCapture(); SendMessage(WM_NCLBUTTONDOWN,HTCAPTION,0); CDialog::OnLButtonDown(nFlags, point); } void CDDlg::OnSelections() { CSelectDlg sel; if(sel.DoModal()==IDOK) { this->m_bAddNew0=sel.m_bAddNew; this->m_bDel0=sel.m_bDel; this->m_bModify0=sel.m_bModify; this->m_bRename0=sel.m_bRename; this->m_bOther0=sel.m_bOther; ::WritePrivateProfileString("Selections","m_bAddNew",sel.m_bAddNew? "1":"0",".\\Settings.ini"); ::WritePrivateProfileString("Selections","m_bDel",sel.m_bDel? "1":"0",".\\Settings.ini"); ::WritePrivateProfileString("Selections","m_bModify",sel.m_bModify? "1":"0",".\\Settings.ini"); ::WritePrivateProfileString("Selections","m_bRename",sel.m_bRename? "1":"0",".\\Settings.ini"); ::WritePrivateProfileString("Selections","m_bOther",sel.m_bOther? "1":"0",".\\Settings.ini"); } } void CDDlg::OnDblclkList1(NMHDR* pNMHDR, LRESULT* pResult) { int nIndex = m_list.GetNextItem(-1, LVNI_ALL | LVNI_SELECTED); if(nIndex == -1) return; char buf[200]; m_list.GetItemText(nIndex,3,buf,200); CString str; str=this->m_strWatchedDir+"\\"+buf; ::ShellExecute(NULL,"open",str,NULL,NULL,SW_SHOW); *pResult = 0; *pResult = 0; }