MFC软件卸载代码

2024-06-14 23:18
文章标签 代码 软件 卸载 mfc

本文主要是介绍MFC软件卸载代码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

// 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
}

这篇关于MFC软件卸载代码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1061774

相关文章

Java中调用数据库存储过程的示例代码

《Java中调用数据库存储过程的示例代码》本文介绍Java通过JDBC调用数据库存储过程的方法,涵盖参数类型、执行步骤及数据库差异,需注意异常处理与资源管理,以优化性能并实现复杂业务逻辑,感兴趣的朋友... 目录一、存储过程概述二、Java调用存储过程的基本javascript步骤三、Java调用存储过程示

Visual Studio 2022 编译C++20代码的图文步骤

《VisualStudio2022编译C++20代码的图文步骤》在VisualStudio中启用C++20import功能,需设置语言标准为ISOC++20,开启扫描源查找模块依赖及实验性标... 默认创建Visual Studio桌面控制台项目代码包含C++20的import方法。右键项目的属性:

MySQL数据库的内嵌函数和联合查询实例代码

《MySQL数据库的内嵌函数和联合查询实例代码》联合查询是一种将多个查询结果组合在一起的方法,通常使用UNION、UNIONALL、INTERSECT和EXCEPT关键字,下面:本文主要介绍MyS... 目录一.数据库的内嵌函数1.1聚合函数COUNT([DISTINCT] expr)SUM([DISTIN

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

Go语言代码格式化的技巧分享

《Go语言代码格式化的技巧分享》在Go语言的开发过程中,代码格式化是一个看似细微却至关重要的环节,良好的代码格式化不仅能提升代码的可读性,还能促进团队协作,减少因代码风格差异引发的问题,Go在代码格式... 目录一、Go 语言代码格式化的重要性二、Go 语言代码格式化工具:gofmt 与 go fmt(一)

如何在Mac上彻底删除Edge账户? 手动卸载Edge浏览器并清理残留文件技巧

《如何在Mac上彻底删除Edge账户?手动卸载Edge浏览器并清理残留文件技巧》Mac上的Edge账户里存了不少网站密码和个人信息,结果同事一不小心打开了,简直尴尬到爆炸,想要卸载edge浏览器并清... 如果你遇到 Microsoft Edge 浏览器运行迟缓、频繁崩溃或网页加载异常等问题,可以尝试多种方

Qt 设置软件版本信息的实现

《Qt设置软件版本信息的实现》本文介绍了Qt项目中设置版本信息的三种常用方法,包括.pro文件和version.rc配置、CMakeLists.txt与version.h.in结合,具有一定的参考... 目录在运行程序期间设置版本信息可以参考VS在 QT 中设置软件版本信息的几种方法方法一:通过 .pro

HTML5实现的移动端购物车自动结算功能示例代码

《HTML5实现的移动端购物车自动结算功能示例代码》本文介绍HTML5实现移动端购物车自动结算,通过WebStorage、事件监听、DOM操作等技术,确保实时更新与数据同步,优化性能及无障碍性,提升用... 目录1. 移动端购物车自动结算概述2. 数据存储与状态保存机制2.1 浏览器端的数据存储方式2.1.

基于 HTML5 Canvas 实现图片旋转与下载功能(完整代码展示)

《基于HTML5Canvas实现图片旋转与下载功能(完整代码展示)》本文将深入剖析一段基于HTML5Canvas的代码,该代码实现了图片的旋转(90度和180度)以及旋转后图片的下载... 目录一、引言二、html 结构分析三、css 样式分析四、JavaScript 功能实现一、引言在 Web 开发中,

Mac系统下卸载JAVA和JDK的步骤

《Mac系统下卸载JAVA和JDK的步骤》JDK是Java语言的软件开发工具包,它提供了开发和运行Java应用程序所需的工具、库和资源,:本文主要介绍Mac系统下卸载JAVA和JDK的相关资料,需... 目录1. 卸载系统自带的 Java 版本检查当前 Java 版本通过命令卸载系统 Java2. 卸载自定