C++
文章平均质量分 57
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 · 705 阅读 · 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 · 2484 阅读 · 0 评论 -
C++/MFC 面试题(四、设计模式)
一、介绍设计模式(Design pattern)代表了最佳的实践,通常被有经验的面向对象的软件开发人员所采用。设计模式是软件开发人员在软件开发过程中面临的一般问题的解决方案。这些解决方案是众多软件开发人员经过相当长的一段时间的试验和错误总结出来的。二、种类设计模式的种类创建型模式,共五种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式。结构型模式,共七种:适配器模式、装饰器模式、代理模式、外观模式、桥接模式、组合模式、享元模式。行为型模式,共十一种:策略模式、模板方法模式、观察者模原创 2021-09-24 16:39:54 · 976 阅读 · 0 评论 -
C++/MFC 面试题(三、C++11与STL)
一、STL标准模板库(Standard Template Library)包含了很多实用的组件,利用这些组件,程序员编程更加方便高效1.1 STL的基本组成部分是什么?容器、迭代器、算法是STL的三个基本组成部分容器:是对象的集合,举例:vector、list、stack、queue、set、map、deque迭代器:面向对象版本的指针,STL算法通过迭代器在容器上进行操作算法:对容器进程处理的函数,如:for_each、copy、sort、merge、search1.2 vector容器与原创 2021-09-23 21:46:51 · 812 阅读 · 0 评论 -
C++/MFC 面试题(二、C++理论)
一、面向对象1.1 什么是面向对象程序设计面向对象程序设计是一种程序设计泛型,这种泛型的主要特征是 程序 = 对象 + 消息1.2 什么是对象?什么是类?二者关系?对象:将描述其属性的数据以及对这些数据施加的一组操作封装在一起构成的统一体。类:具有相同的数据和相同的操作的一组对象的集合,关系:类是对具有相同数据结构和相同操作的一类对象的描述类是对象的抽象,对象是类的实例1.3 什么是消息?消息具有什么性质?面向对象程序设计中,对象之间的联系称之为对象的交互。面向对象程序设计中提供的原创 2021-09-22 21:50:09 · 1644 阅读 · 0 评论 -
C++/MFC 面试题(一)
一、面向对象面向对象的三大特性:封装、继承、多态封装:封装是把客观事物抽象成类,并且把自己的属性和方法让可信的类或对象操作,对不可性的隐藏。继承:可以让某个类型的对象获得另一个类型的对象的属性的方法。多态:虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。多态的实现1)用抽象类实现多态抽象类和抽象方法实现多态性父类提供一系列规定, 约束子类的行为父类可以提供一些共性的行为2)用接口实现多态生活中的接口最具代表性的就是插座,例如原创 2021-09-15 08:46:27 · 4863 阅读 · 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 · 7156 阅读 · 1 评论 -
创建非模态对话框,程序崩溃
通常来说,创建一个非模态对话框非常简单,只需要三行。 CTestDlg *pDlg = new CTestDlg; pDlg->Create(IDD_DIALOG1, this); pDlg->ShowWindow(SW_SHOW);但是在某些情况下,程序直接崩溃打断点观察的现象是到第三行显示的时候崩溃。在仔细看每一行的代码,我们可以看到创建时pDlg指针虽然不为null,但是它的m_hWnd指针却为空,这是为什么呢?简单的来说,很明显在创建时 就已经失败了,只是程序并没有立即原创 2021-09-08 21:42:11 · 737 阅读 · 0 评论 -
用C++写一个自己的QQ(九、界面交互)
一、登录界面就一个登录按钮:二、客户端界面2.1 显示账户信息这个代码逻辑同服务端一样看懂服务端的,就知道这里该怎么写了,一模一样,所以不赘述了2.2 打开聊天窗口双击用户,打开聊天窗口三、聊天界面3.1 初始化初始化时,加载对方信息和我的信息3.2 发送消息点击发送按钮:3.3 接收消息开个定时器,定时刷新即可四、运行最后再来看一遍运行效果启动服务器打开客户端,输入id密码,登录登录多个用户,这里我没有做实时的刷新,所以有些已经登录上了还是灰色状态原创 2021-09-08 11:56:12 · 1152 阅读 · 0 评论 -
用C++写一个自己的QQ(八、TCP通信客户端)
一、通信格式通信格式在之前,就已经定好了,采用JSON主要有两个类:1.1 JsonCtrl这个类主要用来拼接和解析Json格式的字符串1.2 MessageCtrl这个类主要用来收发消息后的相关处理二、TCP通信这里很明显要用客户单了,当然我们还是采用HPSocket,不再详细赘述.cpp文件#include "TCPClient.h"#include <string>using namespace std;TCPClient::TCPClient() :m_C原创 2021-09-08 11:44:44 · 776 阅读 · 0 评论 -
用C++写一个自己的QQ(七、客户端界面设计)
一、登录界面一个账户ID,一个密码程序启动时自动TCP连接点击登录,发送id和密码到服务端,服务端从数据库中比较返回登录结果二、客户端界面登录成功后,请求获取联系人列表,使用tree控件显示,并显示在线状态三、聊天窗口双击tree控件中在线的人,弹出聊天窗口,即可开始聊天...原创 2021-09-08 11:35:58 · 844 阅读 · 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 · 754 阅读 · 0 评论 -
用C++写一个自己的QQ(五、通信数据格式Json)
一、说明说明是JSON,JSON该怎么用,不再详细赘述,可以查看本人的这篇文章:配置文件:CJSON的使用1.1 类型说明枚举了一些类型,登录信息在线信息登出信息其他用户是否在线信息发送信息接收信息联系人信息所有用户信息所有部门信息主管信息部门员工信息指定联系人信息1.2 流程以登录信息的JSON字符串为例通常有两部分构成:消息类型消息内容{ "msg_type": 0, "LOGIN": { "id": 7, "password": "12345原创 2021-09-08 11:14:56 · 529 阅读 · 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 · 840 阅读 · 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 · 360 阅读 · 1 评论 -
用C++写一个自己的QQ(二、使用MySQL读写数据)
一、新建数据库新建一张tb_account表,用来存放账户信息新建一张tb_department表,用来存放部门信息二、项目配置新建include,lib文件夹include下放入mysql的头文件lib下放入mysql的库路径包涵附加依赖项三、封装类一个简单的单例模式封装.cpp文件#include "pch.h"#include "MysqlUtil.h"MysqlUtil* MysqlUtil::m_Instance = nullptr;MysqlUti原创 2021-09-08 10:37:16 · 431 阅读 · 0 评论 -
用C++写一个自己的QQ(一、服务端界面设计)
一、新建工程VS版本:VS2019二、主界面主界面主要有三个功能:启动服务器,等待客户端连接部门设置,新增删除查看部门账户设置,新增账户查看账户三、部门设置用一个tree控件显示部门信息,并且鼠标左键点击,右侧显示该部门的详细信息。四、账户设置使用一个tree控件显示账户信息,鼠标点击可显示选择账户的详细信息可增加账户,设置主管,可删除账户。...原创 2021-09-08 10:26:27 · 922 阅读 · 2 评论 -
C++ 如何操作mysql
一、创建数据库创建数据库db_myqq创建用户信息表tb_account创建部门表tb_department;二、工程配置VS版本:VS2019mysql版本:2.1 新建工程工程随便选择,MFC、空工程都可以2.2 复制文件夹找到以下路径中的include和lib将其放到新建的工程内部2.3 属性配置包涵引用目录include和库目录lib附加依赖项:libmysql.lib2.4 添加dll文件将lib文件夹下的libmysql.dll文件放在程序运行目录下原创 2021-09-03 21:29:50 · 861 阅读 · 0 评论 -
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 · 490 阅读 · 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 · 1249 阅读 · 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 · 1044 阅读 · 0 评论 -
C++写一个内存清理软件(二、控制面板操作)
一、新增界面新增dlg界面,并修改下图的属性添加12个按钮,修改名称,以及自绘属性(此属性不修改,则重绘代码无效)二、添加资源将图标资源放入res文件夹内后,在资源视图中进行添加三、交互依次双击十二个按钮,在生成的函数中加入以下代码void CDlgControl::OnBnClickedBtnInternet(){ // 打开 IE 的设置窗口 ::ShellExecute(NULL, "OPEN", "rundll32.exe", "shell32.dll Contr原创 2021-09-03 06:28:16 · 523 阅读 · 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 · 555 阅读 · 0 评论 -
C++ + MFC 写一个程序参数修改器(六、dll注入)
一、说明DLL注入技术可以被正常软件用来添加/扩展其他程序,调试或逆向工程的功能性;该技术也常被恶意软件以多种方式利用。这意味着从安全角度来说,了解DLL注入的工作原理是十分必要的。注入攻击相关例子二、新建DLL程序三、增加代码增加钩子函数响应键盘函数四、配置打开Def文件增加新增的函数名称五、调用在界面中双击dll注入,在生成的函数中加入以下代码,运行点击dll注入按钮,即可加载dll程序...原创 2021-09-02 18:53:29 · 489 阅读 · 0 评论 -
C++ + MFC 写一个程序参数修改器(五、界面交互)
一、说明前面几篇,已经将所有基本的工具函数写完,这一篇,主要是将所有的功能串起来,使界面和功能进行交互。二、初始化2.1 初始化两个listctrl查找的list控件只需要一栏,显示地址就可以了目标list控件需要四栏,分别为说明、地址、类型、值,其中说明可以不考虑将这两个函数在OnInitDialog中调用2.2 初始化搜索和编辑设置将这两个函数在OnInitDialog中调用2.3 回调函数三、搜索3.1 首次搜索双击首次搜索按钮,在生成的函数中加入以下代码:逻辑原创 2021-08-28 17:11:59 · 980 阅读 · 0 评论 -
C++ + MFC 写一个程序参数修改器(四、回调函数)
一、说明上一节,我们简单的提了一下,为了得知搜索的进度,我们采用了回调函数的方式来实现进度条,当然你也可以开个线程或者定时器来实现,但是这一篇,我们主要来谈一谈回调函数二、一个简单的回调函数#include <stdio.h> typedef void(*lpFunc)(void *, char *); // 函数指针 // 回调函数的宿主函数,在这里回调用函数被使用, void GetCallBack(void * lpVoid, lpFunc callback) {原创 2021-08-28 16:42:16 · 692 阅读 · 0 评论 -
C++ + MFC 写一个程序参数修改器(三、内存操作)
一、说明本章来介绍一下内存的操作,这个程序参数修改器的其中的一个原理就是读写内存的值,分四步:从选择的进程的内存中读取我们需要的值通过官方软件(例如扫雷程序)改变其值再次从选择的进程的内存中取修改过的值直到没有无法缩小范围,调用api修改内存关键函数两个:ReadProcessMemory 读取内存WriteProcessMemory 写入内存(需要关闭360等安全软件)二、新建Search类该类主要有两个功能:搜索 (分为首次搜索和再次搜索,其中再次搜索是在首次搜索的地原创 2021-08-28 12:41:24 · 938 阅读 · 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 · 746 阅读 · 0 评论 -
C++ + MFC 写一个程序参数修改器(一、界面设计)
一、说明本程序仅为参考二、新建工程三、绘制界面删除多余的东西控件四、资源视图原创 2021-08-27 20:45:14 · 349 阅读 · 0 评论 -
用QT写一个TCP通信助手(四、界面交互)
一、初始化做一些界面上的初始化操作,以及TCP类的初始化设置二、连接2.1 模式切换2.2 连接与断开三、发送与接收3.1 发送3.2 接收四、日志五、运行六、完整的MainWindow代码如下,其他代码在对应的文章中.h文件#ifndef MAINWINDOW_H#define MAINWINDOW_H#include <QMainWindow>#include <qtcp.h>namespace Ui {class Main原创 2021-08-25 22:38:12 · 778 阅读 · 0 评论 -
用QT写一个TCP通信助手(三、TCP通信)
一、说明首先我们先分析一下:由于不支持多继承,所以比MFC稍微麻烦了一点,但是QT又具有它自身的优势,那就是信号和槽,我们不用开线程去监听一些事件的触发,会方便许多。二、 创建一个TCP类这个类的作用是将客户端和服务端的代码进行一定程度上的统一,便于界面去交互调用。首先有五个基本方法:连接/启动断开连接是否已经连接发送接收其次呢,有一个发射的信号和槽,这是为了监听连接状态最后还有一个Getsocket的方法,这个主要是用来获取socket状态使用.h文件#ifndef QTC原创 2021-08-25 22:27:51 · 1011 阅读 · 1 评论 -
Qt 中文路径导致构建失败等问题
一、描述拥有中文路径会导致程序构建失败等一系列问题,那么该如何解决此问题?二、方案2.1 由于中文路径导致构建失败关闭程序,修改当前的路径,将中午替换掉2.2 无法进入断点debug模式才能进入断点之前有中文路径解决方案一:关闭程序,删掉user文件,重启解决方案二:打开项目,修改路径即可...原创 2021-08-23 23:52:27 · 1227 阅读 · 0 评论 -
Qt 中定时器该怎么使用
一、说明QT中有两种使用定时器的方法object类自带的定时器Qtimer定时器类接下来,我们来说明一下该如何使用二、QObject中的定时器的使用三个函数,了解一下:virtual void timerEvent( QTimerEvent *event);在需要使用的类的头文件中,加入上述函数这个函数内部实现定时器时间到了之后,需要处理的事情定时单位级别 毫秒event->timerId()获取进入此处理函数的id号int QObject::startTimer ( i原创 2021-08-23 23:46:36 · 656 阅读 · 0 评论 -
用QT写一个TCP通信助手(二、日志显示)
一、新建日志类不再详细赘述细节,详情请查看Qt里面该怎么用日志(一、qInstallMessageHandler的使用)1.1 新建Qlogger.cpp文件#include "qlogger.h"#include <QApplication>#include <qdatetime.h>#include <QTextStream>#include <QFile>#include <QDate>QLogger* QLogger:原创 2021-08-23 23:34:44 · 1212 阅读 · 1 评论 -
Qt里面该怎么用日志(一、qInstallMessageHandler的使用)
一、qInstallMessageHandler1.1 说明在软件开发维护过程中,日志是不可缺少的一部分,优秀的日志可以帮我们迅速的定位问题的所在这篇文章我们来谈谈QT中日志的使用QT中可以直接使用qInstallMessageHandler来重定义qdebug、qinfo这些消息类型,这样子就很方便于我们的代码的编写了,debug和release时,我们还可以做不同的区分等首先来看一下官方说明嗯,很长的一段英文,我们来把它翻译一下(有道出马一波)1.2 官方样例 #include &原创 2021-08-23 23:23:51 · 1637 阅读 · 0 评论 -
用QT写一个TCP通信助手(一、界面设计)
一、新建工程创建QT widgets工程修改项目名称TCPAssistant,下一步下一步直到出现此界面位置删除多余的控件,只保留如下修改title为TCPAssistant。二、界面设计2.1 模式选择增加两个radio button,重命名为客户端和服务端2.2 连接增加一个push button用来作为连接状态显示增加两个Line Edit用来作为IP和port显示和输入增加两个label来说明IP和port增加两个push Button用来作为连接和断开2.3原创 2021-08-23 06:23:24 · 830 阅读 · 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 · 2371 阅读 · 1 评论 -
MFC+HPSocket+log4cplus的TCP助手(五、软件交互(二))
一、发送重命名发送相关的edit 和按钮双击发送按钮,编写程序,加入以下代码二、接收重命名list关联变量新开一个定时器1,定时器函数里的代码做如下修改list中的sort属性需要修改为false,不然会自动排序显示文本三、启动...原创 2021-08-22 21:31:43 · 266 阅读 · 0 评论 -
MFC+HPSocket+log4cplus的TCP助手(四、软件交互(一))
一、 连接方式切换客户端和服务端切换先重命名关联变量双击客户端radioserver与上述步骤一致初始化设置为client包含头文件新建TCP成员变量状态切换初始状态点击切换client、server模式二、 连接与断开重命名连接与断开按钮双击连接按钮,编写代码三、修改连接状态提示这里不再赘述按键重绘的具体实现细节重命名连接状态按钮关联变量替换类型右键类向导打开定时器生成函数中加入以下代码四、运行...原创 2021-08-22 21:06:23 · 297 阅读 · 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 · 464 阅读 · 0 评论