MFC软件卸载代码
2016-06-24 13:18
309 查看
// m_Software.cpp : 实现文件 // #include "stdafx.h" #include "MFCApplication1.h" #include "m_Software.h" #include "afxdialogex.h" // m_Software 对话框 HANDLE hThread5; m_Software *m_this; DWORD WINAPI ThreadPro5(LPVOID lpThreadParameter) { CRect rt; m_this->MyList.GetClientRect(rt); m_this->MyList.SetExtendedStyle(LVS_EX_FULLROWSELECT); m_this->MyList.InsertColumn(0,_T("软件名"),0,rt.Width( ) / 4); m_this->MyList.InsertColumn(1,_T("厂商"),0,rt.Width( ) / 4); m_this->MyList.InsertColumn(2,_T("安装路径"),0,rt.Width( ) / 4); m_this->MyList.InsertColumn(3,_T("卸载路径"),0,rt.Width( ) / 4); struct _SoftInfo { // 软件名 WCHAR m_strSoftName[50]; // 软件版本号 WCHAR m_strSoftVersion[50]; // 软件安装目录 WCHAR m_strInstallLocation[MAX_PATH]; // 软件发布厂商 WCHAR m_strPublisher[50]; // 主程序所在完整路径 WCHAR m_strMainProPath[MAX_PATH]; // 卸载exe所在完整路径 WCHAR m_strUninstallPth[MAX_PATH]; }SoftInfo; // 主键 HKEY RootKey; // 子键名称 LPCTSTR lpSubKey; // 将要打开键的句柄 HKEY hkResult; // 记录读取注册表是否成功 LONG lReturn; CString strBuffer; CString strMidReg; int i = 0; DWORD index = 0; TCHAR szKeyName[255] = {0}; // 注册表项名称 TCHAR szBuffer[255] = {0}; DWORD dwKeyLen = 255; DWORD dwNameLen = 255; DWORD dwType = REG_BINARY | REG_DWORD | REG_EXPAND_SZ | REG_MULTI_SZ | REG_NONE | REG_SZ; CString *name = new CString; RootKey = HKEY_LOCAL_MACHINE; lpSubKey = _T("SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Uninstall"); //lpSubKey = _T("SOFTWARE\\Wow6432Node\\Microsoft\\Windows\\CurrentVersion\\Uninstall"); bool isOK = false; lReturn = RegOpenKeyEx(RootKey,lpSubKey,0,KEY_ALL_ACCESS,&hkResult); DWORD dwIndex = 0; while(true) { DWORD dwKeyLen = 255; WCHAR szNewKeyName[MAX_PATH] = {}; LONG lReturn = RegEnumKeyEx(hkResult,dwIndex,szNewKeyName,&dwKeyLen,0,NULL,NULL,NULL); OutputDebugString(szNewKeyName); WCHAR strMidReg[MAX_PATH] = {}; swprintf_s(strMidReg,L"%s%s%s",lpSubKey,L"\\",szNewKeyName); HKEY hkValueKey = 0; RegOpenKeyEx(RootKey,strMidReg,0,KEY_QUERY_VALUE,&hkValueKey); DWORD dwNameLen = 255; RegQueryValueEx(hkValueKey,L"DisplayName",0,&dwType,(LPBYTE)SoftInfo.m_strSoftName,&dwNameLen); dwNameLen = 255; if(SoftInfo.m_strSoftName == name[0])//去除重复 { dwIndex++; continue; } name[0] = SoftInfo.m_strSoftName; m_this->MyList.InsertItem(i,NULL); m_this->MyList.SetItemText(i,0,SoftInfo.m_strSoftName); RegQueryValueEx(hkValueKey,L"Publisher",0,&dwType,(LPBYTE)SoftInfo.m_strPublisher,&dwNameLen); dwNameLen = 255; m_this->MyList.SetItemText(i,1,SoftInfo.m_strPublisher); RegQueryValueEx(hkValueKey,L"InstallLocation",0,&dwType,(LPBYTE)SoftInfo.m_strInstallLocation,&dwNameLen); dwNameLen = 255; m_this->MyList.SetItemText(i,2,SoftInfo.m_strInstallLocation); RegQueryValueEx(hkValueKey,L"UninstallString",0,&dwType,(LPBYTE)SoftInfo.m_strUninstallPth,&dwNameLen); dwNameLen = 255; m_this->MyList.SetItemText(i,3,SoftInfo.m_strUninstallPth); i++; dwIndex++; if(lReturn == ERROR_NO_MORE_ITEMS) { break; } } return 0; } IMPLEMENT_DYNAMIC(m_Software, CDialog) m_Software::m_Software(CWnd* pParent /*=NULL*/) : CDialog(m_Software::IDD, pParent) { } m_Software::~m_Software() { } void m_Software::DoDataExchange(CDataExchange* pDX) { CDialog::DoDataExchange(pDX); DDX_Control(pDX,IDC_BUTTON1,m_XieZaii); DDX_Control(pDX,IDC_PROGRESS2,MyList); } BEGIN_MESSAGE_MAP(m_Software, CDialog) ON_BN_CLICKED(IDCANCEL,&m_Software::OnBnClickedCancel) ON_BN_CLICKED(IDC_BUTTON1,&m_Software::OnBnClickedButton1) END_MESSAGE_MAP( ) // m_Software 消息处理程序 //取消按钮 void m_Software::OnBnClickedCancel( ) { // TODO: 在此添加控件通知处理程序代码 CDialog::OnCancel( ); } //卸载按钮 void m_Software::OnBnClickedButton1( ) { // TODO: 在此添加控件通知处理程序代码 CString str1; int nId; POSITION pos = MyList.GetFirstSelectedItemPosition( );//找到位置 nId = (int)MyList.GetNextSelectedItem(pos);//选择的是第几行 str1 = MyList.GetItemText(nId,3);//获取内容,0代表第一列 ShellExecute(NULL,NULL,_T("explorer"),str1,NULL,SW_SHOW); } BOOL m_Software::OnInitDialog( ) { CDialog::OnInitDialog( ); // TODO: 在此添加额外的初始化 // CRect rc; // ::GetClientRect(AfxGetApp( )->m_pMainWnd->m_hWnd,rc); // rc.DeflateRect(0,15,40,90); // MoveWindow(rc); //显示出来 m_this = this; hThread5 = CreateThread(NULL,NULL,ThreadPro5,(LPVOID)1,NULL,NULL); return TRUE; // return TRUE unless you set the focus to a control // 异常: OCX 属性页应返回 FALSE }
相关文章推荐
- 增量式PID推导及C语言实现
- 最常用的两种C++序列化方案的使用心得
- Java Web项目中使用Freemarker生成Word文档
- struts2 #,%,$的用法
- Java中类的初始化顺序
- 高阶排序算法手撸(Java语言)
- 银行家算法(操作系统)(c++)
- C语言题库的上机题
- 快速中值滤波利用VC++和OpenCV调用其封装的动态链接库出现的错误和处理
- c++学习心得
- R语言实战:机器学习与数据分析源代码6(最终弹)
- CocoaPods安装以及相关问题解决
- JAVA的IO操作(二)
- Spring环境搭建
- Java基础集合之TreeSet练习(带答案)
- 处理C++源代码的程序
- 阅读程序
- 处理C++源代码的程序
- SSH三大框架的搭建整合(struts2+spring+hibernate)
- 阅读程序