MFC
文章平均质量分 54
LyRics1996
人生天地间,忽如远行客
展开
-
C++/MFC 面试题(七、综合编程题)
一、简述题1.1 下列声明分别代表什么含义一个最简单的函数指针定义如下:Void (*funcPtr) (); //funcptr是一个函数指针,它指向的函数没有参数,返回值为void1.1.1 Void * (* ( * fp1)(int))[10];fp1是一个函数指针,它指向的函数带有一个int型的参数,返回值为一个指向含有10个void指针数组的指针。若是这个形式Void * ( * fp1)(int)[10],则其返回值为一个指向含有10个void类型的数组的指针。若是这个形式,Vo原创 2021-09-27 18:01:17 · 655 阅读 · 0 评论 -
C++/MFC 面试题(五、MFC)
1. 谈一谈MFC类的继承关系2. 谈一谈CView的子类视图类(CView)的三个子类CScrollView类提供视图的滚动显示;CEditView类支持在视图中的文本编辑操作;CHtmlView类支持在视图中显示和操作html文件。3. 谈一谈静态库与动态库的区别(1)静态链接库与动态链接库 都是共享代码的方式 。静态链接库把最后的指令 都包含 在最终生成的EXE文件中了;动态链接库不必被包含在最终EXE文件中,EXE文件 执行时可以“动态”地引用和卸载 这个与EXE独立的DLL文件。(原创 2021-09-24 20:39:51 · 2297 阅读 · 0 评论 -
C++/MFC 面试题(一)
一、面向对象面向对象的三大特性:封装、继承、多态封装:封装是把客观事物抽象成类,并且把自己的属性和方法让可信的类或对象操作,对不可性的隐藏。继承:可以让某个类型的对象获得另一个类型的对象的属性的方法。多态:虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。多态的实现1)用抽象类实现多态抽象类和抽象方法实现多态性父类提供一系列规定, 约束子类的行为父类可以提供一些共性的行为2)用接口实现多态生活中的接口最具代表性的就是插座,例如原创 2021-09-15 08:46:27 · 4614 阅读 · 1 评论 -
VS2019 动态库的创建以及使用
一、说明动态链接库(Dynamic Link Library 或者 Dynamic-link Library,缩写为 DLL),是微软公司在微软Windows操作系统中,实现共享函数库概念的一种方式。VS2019 提供了三种创建动态库的模式,如下图所示:具有到处项的DLL动态链接库:会自动生成头文件动态链接库DLL:只生成Dll文件嵌入了基础类库二、编写动态库2.1 创建动态库选择“具有导出项的(DLL)动态链接库”,vs会帮我们自动创建与项目同名的.cpp文件和.h文件,并在.h文件原创 2021-09-13 07:31:59 · 6762 阅读 · 1 评论 -
创建非模态对话框,程序崩溃
通常来说,创建一个非模态对话框非常简单,只需要三行。 CTestDlg *pDlg = new CTestDlg; pDlg->Create(IDD_DIALOG1, this); pDlg->ShowWindow(SW_SHOW);但是在某些情况下,程序直接崩溃打断点观察的现象是到第三行显示的时候崩溃。在仔细看每一行的代码,我们可以看到创建时pDlg指针虽然不为null,但是它的m_hWnd指针却为空,这是为什么呢?简单的来说,很明显在创建时 就已经失败了,只是程序并没有立即原创 2021-09-08 21:42:11 · 700 阅读 · 0 评论 -
用C++写一个自己的QQ(九、界面交互)
一、登录界面就一个登录按钮:二、客户端界面2.1 显示账户信息这个代码逻辑同服务端一样看懂服务端的,就知道这里该怎么写了,一模一样,所以不赘述了2.2 打开聊天窗口双击用户,打开聊天窗口三、聊天界面3.1 初始化初始化时,加载对方信息和我的信息3.2 发送消息点击发送按钮:3.3 接收消息开个定时器,定时刷新即可四、运行最后再来看一遍运行效果启动服务器打开客户端,输入id密码,登录登录多个用户,这里我没有做实时的刷新,所以有些已经登录上了还是灰色状态原创 2021-09-08 11:56:12 · 1097 阅读 · 0 评论 -
用C++写一个自己的QQ(七、客户端界面设计)
一、登录界面一个账户ID,一个密码程序启动时自动TCP连接点击登录,发送id和密码到服务端,服务端从数据库中比较返回登录结果二、客户端界面登录成功后,请求获取联系人列表,使用tree控件显示,并显示在线状态三、聊天窗口双击tree控件中在线的人,弹出聊天窗口,即可开始聊天...原创 2021-09-08 11:35:58 · 816 阅读 · 0 评论 -
用C++写一个自己的QQ(六、TCP通信 数据收发)
一、工程配置TCP通信采用HPSocket,具体使用逻辑不再详细赘述,可以查看我的这篇文章HPSocket的使用(一、利用HPsocket 写一个TCP客户端)二、封装类tcp通信没有什么好说的,这里主要是写一个服务端比较精华的是这个函数,我懒的再写一层类封装一下了,所以看着有些臃肿这个函数主要是用来响应所有的消息,并处理后返回给请求的客户端void CTCPServer::MsgCtrl(CString data, int conID){ CString title; for (a原创 2021-09-08 11:24:24 · 731 阅读 · 0 评论 -
用C++写一个自己的QQ(四、账户设置)
一、封装类将账户设置可能的操作,封装到一个类中通过分析,它应该有以下几个功能通过id号获取该id对应的账户信息获取所有账户信息获取部门主管信息通过部门id获取此部门所有账户信息添加账户设置账户为主管获取最新添加的账户信息删除账户.cpp文件#include "pch.h"#include "AccountCtrl.h"AccountCtrl::AccountCtrl(){ m_sql = MysqlUtil::GetInstance();}AccountCtrl:原创 2021-09-08 11:05:10 · 819 阅读 · 0 评论 -
用C++写一个自己的QQ(三、部门设置)
一、封装类我们将对部门的操作,封装成一个类首先我们简单分析一下可以知道,部门的相关操作应当有三个:获取该部门所有成员的信息增加一个部门删除一个部门.cpp文件#include "pch.h"#include "DepartmentCtrl.h"DepartmentCtrl::DepartmentCtrl(){ m_sql = MysqlUtil::GetInstance();}DepartmentCtrl::~DepartmentCtrl(){}bool Depa原创 2021-09-08 10:50:45 · 341 阅读 · 1 评论 -
用C++写一个自己的QQ(一、服务端界面设计)
一、新建工程VS版本:VS2019二、主界面主界面主要有三个功能:启动服务器,等待客户端连接部门设置,新增删除查看部门账户设置,新增账户查看账户三、部门设置用一个tree控件显示部门信息,并且鼠标左键点击,右侧显示该部门的详细信息。四、账户设置使用一个tree控件显示账户信息,鼠标点击可显示选择账户的详细信息可增加账户,设置主管,可删除账户。...原创 2021-09-08 10:26:27 · 892 阅读 · 2 评论 -
C++写一个内存清理软件(五、进程管理)
一、界面1.1 界面绘制一个tab、一个list1.2 初始化1.3 重绘二、菜单2.1 新建菜单资源视图中新加入菜单2.2 刷新与结束进程添加事件处理程序2.3 显示进程双击添加事件后,加入下面程序void CDlgTask::OnTcnSelchangeTab1(NMHDR* pNMHDR, LRESULT* pResult){ // TODO: 在此添加控件通知处理程序代码 ShowList(m_tab.GetCurSel()); // 设置列表原创 2021-09-03 11:03:26 · 474 阅读 · 2 评论 -
C++写一个内存清理软件(四、垃圾清理)
一、创建垃圾文件选择界面二、初始化垃圾文件选择check状态类向导添加此函数后,加入下面代码:三、重绘垃圾文件格式选择界面将界面背景变为黑色四、新建垃圾文件清理界面五、清理5.1 初始化驱动器5.2 选项垃圾文件读取5.3 开始与结束清理5.4 文件删除void CDlgLoser::FileDelete(CString FilePath){ CString num, str, Name, FileName; CFileFind file; if (FilePa原创 2021-09-03 10:02:44 · 1175 阅读 · 2 评论 -
C++写一个内存清理软件(三、内存清理)
一、界面添加static、check、list、button二、重绘重绘控件,改变控件颜色右键类向导,生成函数后加入以下代码三、初始化右键类向导,在生成函数中加入以下代码四、交互双击清理按钮,加入以下代码五、清理void CDlgDisk::ClearDisk(int num){ LPINTERNET_CACHE_ENTRY_INFO pEntry = NULL; HANDLE hDir = NULL; HANDLE hTemp = NULL; unsigned l原创 2021-09-03 07:54:26 · 1014 阅读 · 0 评论 -
C++写一个内存清理软件(二、控制面板操作)
一、新增界面新增dlg界面,并修改下图的属性添加12个按钮,修改名称,以及自绘属性(此属性不修改,则重绘代码无效)二、添加资源将图标资源放入res文件夹内后,在资源视图中进行添加三、交互依次双击十二个按钮,在生成的函数中加入以下代码void CDlgControl::OnBnClickedBtnInternet(){ // 打开 IE 的设置窗口 ::ShellExecute(NULL, "OPEN", "rundll32.exe", "shell32.dll Contr原创 2021-09-03 06:28:16 · 501 阅读 · 0 评论 -
C++写一个内存清理软件(一、界面设计)
一、新建工程选择MFC,创建新项目,修改工程名,选择基于对话框,创建。二、 自绘title2.1 修改属性2.2 加载位图2.3 定义title需要的变量和相关方法void CCleanMasterDlg::DrawCaption(){ // 标题文本不为空 if (!m_caption.IsEmpty()) { CDC* pDC = GetWindowDC(); // 获得窗口设备上下文 pDC->SetBkMode(TRANSPA原创 2021-09-02 23:27:51 · 535 阅读 · 0 评论 -
C++ + MFC 写一个程序参数修改器(六、dll注入)
一、说明DLL注入技术可以被正常软件用来添加/扩展其他程序,调试或逆向工程的功能性;该技术也常被恶意软件以多种方式利用。这意味着从安全角度来说,了解DLL注入的工作原理是十分必要的。注入攻击相关例子二、新建DLL程序三、增加代码增加钩子函数响应键盘函数四、配置打开Def文件增加新增的函数名称五、调用在界面中双击dll注入,在生成的函数中加入以下代码,运行点击dll注入按钮,即可加载dll程序...原创 2021-09-02 18:53:29 · 458 阅读 · 0 评论 -
C++ + MFC 写一个程序参数修改器(五、界面交互)
一、说明前面几篇,已经将所有基本的工具函数写完,这一篇,主要是将所有的功能串起来,使界面和功能进行交互。二、初始化2.1 初始化两个listctrl查找的list控件只需要一栏,显示地址就可以了目标list控件需要四栏,分别为说明、地址、类型、值,其中说明可以不考虑将这两个函数在OnInitDialog中调用2.2 初始化搜索和编辑设置将这两个函数在OnInitDialog中调用2.3 回调函数三、搜索3.1 首次搜索双击首次搜索按钮,在生成的函数中加入以下代码:逻辑原创 2021-08-28 17:11:59 · 949 阅读 · 0 评论 -
C++ + MFC 写一个程序参数修改器(四、回调函数)
一、说明上一节,我们简单的提了一下,为了得知搜索的进度,我们采用了回调函数的方式来实现进度条,当然你也可以开个线程或者定时器来实现,但是这一篇,我们主要来谈一谈回调函数二、一个简单的回调函数#include <stdio.h> typedef void(*lpFunc)(void *, char *); // 函数指针 // 回调函数的宿主函数,在这里回调用函数被使用, void GetCallBack(void * lpVoid, lpFunc callback) {原创 2021-08-28 16:42:16 · 614 阅读 · 0 评论 -
C++ + MFC 写一个程序参数修改器(三、内存操作)
一、说明本章来介绍一下内存的操作,这个程序参数修改器的其中的一个原理就是读写内存的值,分四步:从选择的进程的内存中读取我们需要的值通过官方软件(例如扫雷程序)改变其值再次从选择的进程的内存中取修改过的值直到没有无法缩小范围,调用api修改内存关键函数两个:ReadProcessMemory 读取内存WriteProcessMemory 写入内存(需要关闭360等安全软件)二、新建Search类该类主要有两个功能:搜索 (分为首次搜索和再次搜索,其中再次搜索是在首次搜索的地原创 2021-08-28 12:41:24 · 906 阅读 · 0 评论 -
C++ + MFC 写一个程序参数修改器(二、进程操作)
一、添加进程操作类右键、添加类添加变量二、获取所有32位进程2.1 获取所有进程创建进程快照判断第一个进程遍历剩余进程2.2 判断是否为32位进程2.3 判断是否为32位操作系统2.4 获取路径与图标三、加载3.1 打开进程列表界面双击主界面中的进程列表,在生成代码中打开进程列表界面:3.2 类向导添加OnInitDialog函数右键类向导,添加OnInitDialog函数,加入以下代码3.3 双击获取选择进程右键添加时间处理程序,选择双击,原创 2021-08-27 22:05:11 · 726 阅读 · 0 评论 -
C++ + MFC 写一个程序参数修改器(一、界面设计)
一、说明本程序仅为参考二、新建工程三、绘制界面删除多余的东西控件四、资源视图原创 2021-08-27 20:45:14 · 319 阅读 · 0 评论 -
MFC中如何修改BUTTON按钮颜色
新建一个类继承CButton.h文件#pragma once#include <afxwin.h>class COwerButton : public CButton{ DECLARE_DYNAMIC(COwerButton) public: COwerButton(); virtual ~COwerButton(); void SetButtonBgColor(COLORREF color); void SetButtonTextColor(COLORR原创 2021-08-22 21:35:30 · 2322 阅读 · 1 评论 -
MFC+HPSocket+log4cplus的TCP助手(五、软件交互(二))
一、发送重命名发送相关的edit 和按钮双击发送按钮,编写程序,加入以下代码二、接收重命名list关联变量新开一个定时器1,定时器函数里的代码做如下修改list中的sort属性需要修改为false,不然会自动排序显示文本三、启动...原创 2021-08-22 21:31:43 · 246 阅读 · 0 评论 -
MFC+HPSocket+log4cplus的TCP助手(四、软件交互(一))
一、 连接方式切换客户端和服务端切换先重命名关联变量双击客户端radioserver与上述步骤一致初始化设置为client包含头文件新建TCP成员变量状态切换初始状态点击切换client、server模式二、 连接与断开重命名连接与断开按钮双击连接按钮,编写代码三、修改连接状态提示这里不再赘述按键重绘的具体实现细节重命名连接状态按钮关联变量替换类型右键类向导打开定时器生成函数中加入以下代码四、运行...原创 2021-08-22 21:06:23 · 281 阅读 · 0 评论 -
MFC+HPSocket+log4cplus的TCP助手(三、HPSocket)
一、功能类设计1.1 新建头文件新建一个CTCP.h的头文件,该文件为虚基类(或者说接口),包含TCP通信的基本方法1.2 功能分析连接是否已连接发送接收二、包含HPSocket关于HPSocket怎么使用,可以查看本人单独的文章HPSocket的使用(一、利用HPsocket 写一个TCP客户端),这里不再详细赘述2.1 包含路径2.2 新建工具类新建一个client类,一个server类client类继承public CTcpClientListener,实现四个函原创 2021-08-22 20:11:34 · 441 阅读 · 0 评论 -
MFC+HPSocket+log4cplus的TCP助手(二、日志显示)
一、搭建环境log4cplus的使用这里我们不再细讲大家可以参照我这篇文章来log4cPLus的搭建使用1.1 属性修改将字符集修改为多字节(此处是为了与log4cplus的库保持一致,如果你的库是Unicode的,那么这里也应是Unicode)1.2 新建文件夹新建lib和include文件夹,里面放入log4cplus需要的日志和头文件1.3 路径包含include,lib分别为新建的文件夹include/log4cplus为include下新建的log4cplus文件夹,其中包含原创 2021-08-22 09:36:25 · 588 阅读 · 0 评论 -
MFC+HPSocket+log4cplus的TCP助手(一、界面绘制)
一、创建MFC工程VS版本:VS2019然后完成,如下图资源视图中如下:创建完毕二、绘制界面双击资源视图中的IDD_TCPASSISTANT_DIALOG2.1 删掉多余的部分2.2 起个名字2.3 模式切换(连接方式)大家都知道TCP分为客户端和服务端,我们加两个radio button来进行切换CTRL + ALT + X 切换出来工具箱,选中radio button修改一下名字2.4 连接IP、端口增加一个IP(IP Control)、一个端口(E原创 2021-08-22 08:10:16 · 348 阅读 · 0 评论 -
配置文件:INI的简单封装
一、前言1.1 什么是INI.ini 文件是Initialization File的缩写,即初始化文件,是windows的系统配置文件所采用的存储格式,统管windows的各项配置。其有三个相关的API,如下,关于他们的使用在MFC读写ini配置文件之中就有说明,不再赘述,直接来对其做一层简单的封装。WritePrivateProfileStringGetPrivateProfileStringGetPrivateProfileInt二、封装2.1 .h#pragma once#incl原创 2021-06-13 22:22:16 · 347 阅读 · 0 评论 -
配置文件:CJSON的使用
一、前言1.1 什么是JSONJSON(JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它基于 ECMAScript (欧洲计算机协会制定的js规范)的一个子集,采用完全独立于编程语言的文本格式来存储和表示数据。简洁和清晰的层次结构使得 JSON 成为理想的数据交换语言。 易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率1.2 什么是CJsoncJSON从名字可知,整个项目都是以极标准的C来写的,意思说,可以跨各种平台使用了。原创 2021-06-13 22:14:34 · 275 阅读 · 0 评论 -
RabbitMQ的简单原理与操作(一、介绍、安装、编译)
一、什么是RabbitMQrabbitmq是一个开源的AMQP实现,服务器端用erlang语言编写,支持多种客户端。用于在分布式系统中存储转发消息,在易用性、扩展性、高可用性等方面表现不俗。二、RabbitMQ解决了什么问题同步变异步 参考地址1:https://www.cnblogs.com/chjxbt/p/11377402.html流量控制 参考地址2:https://blog.csdn.net/liyu121/article/details/89961991服务解耦 参考原创 2021-06-13 21:58:55 · 210 阅读 · 0 评论 -
HPSocket的使用(一、利用HPsocket 写一个TCP客户端)
一、前言什么是HP socket?参考链接:https://www.oschina.net/p/hp-socketHP-Socket 是一套通用的高性能 TCP/UDP/HTTP 通信框架,包含服务端组件、客户端组件和Agent组件,广泛适用于各种不同应用场景的 TCP/UDP/HTTP 通信系统,提供 C/C++、C#、Delphi、E(易语言)、Java、Python 等编程语言接口。HP-Socket 对通信层实现完全封装,应用程序不必关注通信层的任何细节;HP-Socket 提供基于事件通知原创 2021-06-13 21:43:57 · 12194 阅读 · 3 评论 -
AfxGetApp()->GetMainWnd()和AfxGetMainWnd()的区别
在多线程程序中AfxGetApp()->m_pMainWnd 应用程序主线程的句柄,在一个多线程应用程序中是唯一的AfxGetMainWnd() 调用线程的句柄,暨当前语句所在线程的句柄,不唯一。原创 2021-03-31 17:24:09 · 192 阅读 · 0 评论 -
C++ Excel表格解析(一、MFC工程中的应用)
一、前言C++怎么解析Excel呢,这两天研究了一下,这一篇就来谈一谈MFC中如何解析Excel。二、准备2.1 代码结构2.2 类说明2.2.1 类型库 图中圈出来的这些类,都是一些自带的类,两种方式, 方式一:你直接复制其他工程的即可 方式二:添加新项->添加类->选择这几个类即可。(VS2019不支持)(2.3.2有介绍)2.2.2 主界面类2.2.3 加载图片界面类2.2.4 MFC生成的启动类2.3 新建工程2.3.1 新建项目(两个关键步骤)原创 2021-02-03 19:42:46 · 1956 阅读 · 1 评论 -
调用含有CString参数的函数, 错误LNK2019 无法解析的外部符号
一.前言如图所示,调用含有CString参数的函数,报如下错误.二.原因头文件包含错误MFC工程下CString 的头文件是:#include <afx.h>其他工程下CString 的头文件是:#include <atlstr.h>原创 2020-12-02 17:30:18 · 543 阅读 · 2 评论 -
MFC读写ini配置文件
一、前言MFC 读写配置文件,有三个核心函数,分别为***WritePrivateProfileString***和***GetPrivateProfileString***和***GetPrivateProfileInt***,下面来介绍一下这三个函数的使用二、创建ini文件2.1 创建ini文件在此目录下新建文件夹IniFile在Ini文件里新建TXT文件,然后重命名为Settings.ini文件。在文件中,按如下格式书写:简单说明一下:三、WritePrivateProfil原创 2020-11-22 17:32:06 · 3171 阅读 · 2 评论 -
error LNK2005: “void __cdecl operator delete(void *)“ (??3@YAXPAX@Z) 已经在 LIBCMTD.lib(delete_scalar.o
如题:error LNK2005: “void __cdecl operator delete(void *)” (??3@YAXPAX@Z) 已经在 LIBCMTD.lib(delete_scalar.obj) 中定义fatal error LNK1169: 找到一个或多个多重定义的符号我只是定义了一个类,还是自动生成的,连类里面的内容都没有写,就报了一个2005,一个1169,如图所示。查看了网上的资料,发现大多提到的原因都是 重定义了某些函数或者变量,让我直接就懵逼了,我只是写了原创 2020-10-20 23:35:05 · 728 阅读 · 0 评论