- 博客(202)
- 资源 (21)
- 收藏
- 关注
原创 unique_ptr编译错误can‘t delete an incomplete type
如果一个类没有用户声明的构造或者析构函数,析构函数会被隐式地声明为默认析构函数(8.4)。隐式声明的析构函数是其类的内联公有成员。在编译时遇到test没有声明构造和析构就会默认生成,但是在这个位置还没有include base的头文件,展开模板就会报错。因为test类没有声明构造或者析构函数所以编译器生成了一个默认的构造和析构函数。使用了前置声明的base。
2023-06-19 19:14:13 511
原创 VS查看对象的虚表
在VS中的导出虚函数表在DirectX SDK中的相关例子中,打开对应的工程按如下方式操作:打开项目属性页,配置属性|C/C++|命令行|其它选项(D)例如:/d1 reportSingleClassLayoutIDirect3DDevice9可以导出IDirect3DDevice9的继承和虚函数表信息已启动生成…1>------ 已启动生成: 项目: CFHappy, 配置: Release x64 ------1>pch.cpp1>Utils.cpp1>CFHap
2022-04-23 18:39:32 452
原创 网易Duilib基础
概述Duilib 是 Windows 系统下的开源的 DirectUI 界面库(遵循 BSD 协议),完全免费,可用于商业软件开发。Duilib 可以简单方便地实现大多数界面需求,包括换肤、换色、透明等功能,支持多种图片格式,使用 XML 可以方便地定制窗口,能较好地做到 UI 和逻辑相分离,尽量减少在代码里创建 UI 控件。目前,Duilib 已经在国内有较为广泛的使用。网易 Duilib 使用 C++11 重写,在其原有基础上做了较大重构,搭配谷歌的基础组件 Base 库、基于 Chromium
2021-12-19 18:02:35 1425
原创 GdiPlus
GDI是Graphics Device Interface的缩写,含义是图形设备接口,它的主要任务是负责系统与绘图程序之间的信息交换,处理所有Windows程序的图形输出。在Windows操作系统下,绝大多数具备图形界面的应用程序都离不开GDI,我们利用GDI所提供的众多函数就可以方便的在屏幕、打印机及其它输出设备上输出图形,文本等操作。GDI的出现使程序员无需要关心硬件设备及设备驱动,就可以将应用程序的输出转化为硬件设备上的输出,实现了程序开发者与硬件设备的隔离,大大方便了开发工作。GDI+是Wind
2021-12-12 17:07:30 2071
原创 Windows对话框
一个对话框模板资源创建一个无模式的对话框CreateDialog()函数函数功能:CreateDialog宏从一个对话框模板资源创建一个无模式的对话框,CreateDiaog宏使用CreateDialogParam函数。函数原型:HWND CreateDialog(HINSTANCE hlnstance,LPCTSTR lpTemplate,HWND hWndParent,DLGPROC IpDialogFunc);新建一个windows空项目添加一个main.cpp添加一个dialog资源文
2021-12-12 15:32:07 1287
原创 GUI绘图
简单图形绘制在win32上面绘制图形其实是比较简单的。要想进行图形绘制,关键是找到设备上下文。就我目前所知道的,获得设备上下文主要有这么几种方式:一、根据BeginPaint获得设备上下文,这主要在WM_PAINT使用;二、根据GetDC获得设备上下文,这主要用在非WM_PAINT消息中;三、CreateDC获得设备上下文,这个主要用在屏幕的截取;四、根据CreateCompatibleDC获得设备上下文,然后通过BitBlt进行绘制,这个一般用在图形界面较多的绘制场景。WM_PAINT下用BeginP
2021-11-28 17:33:09 1021
原创 Win32 API 菜单和控件
控件控件概念控件: 特殊的一类”子”窗口,系统已经定义好了窗口类型创建方式和创建窗口类似,调用CreateWindow,每个控件都有自己的ID控件事件发生后,会向所在的父窗口发送通知消息可以使用SendMessage和PostMessage给控件发送消息注意: 创建窗口时必须添加两个属性WS_CHILD:控件是放在我们的窗口上的,自然要作为窗口的子窗口,WS_CHILDWINDOW也一样WS_VISIBLE:设置可见创建控件函数HWND WINAPI CreateWindow( 类名
2021-11-27 00:58:59 2249
原创 屏幕尺寸、分辨率、DPI、PPI
屏幕尺寸下面这张图是华为荣耀7的尺寸图,图上写的是5.2英寸。我们所说的这个5.2英寸是手机屏幕对角线的长度。我们平时是不用英寸这个单位的,我们用的是毫米,厘米,米这些单位。那么英寸和毫米,厘米之间怎样的换算关系呢?1英寸(inch)=2.54厘米(cm)2.54 * 5.2 = 13.208 (cm)即对角线的长度为13.208cm分辨率(resolution)指给定的面积内“点”或“像素”的数量。有时被称为“解析度”。可分为显示分辨率、图像分辨率、打印分辨率和扫描分辨率等。分辨率可以
2021-11-21 22:45:50 12383
原创 Windows对异常的处理
异常处理异常产生后,首先是要记录异常信息(异常的类型、异常发生的位置等),然后要寻找异常的处理函数,称为异常的分发,最后找到异常处理函数并调用,称为异常处理。异常的分类cpu产生的异常执行指令时检测到的错误,除0,GP,无效指令Machine Check Exceptions, 总线错误,ECC错误,Cache错误预先埋伏的,int 3,调试异常程序产生RaiseException,Win32 APIC++,throw Exception,编译器会翻译为对RaiseException
2021-11-06 00:05:28 528
原创 调试器的原理
软件断点int3指令机器码为1字节,即0xCC没有数量限制局限性属于代码类断点,即可以让CPU执行到代码段内的某个地址时停下来,不适用于数据段和I/O空间对于在ROM(只读存储器)中执行的程序(比如BIOS或者其他固件程序),无法动态增加软件断点。因为目标内存是只读的无法动态写入断点指令。这时就要使用我们后面要介绍的硬件断点。实验是用windbg给MessageBoxW下断点,windbg只有在程序运行的时候才会把断点的地方改为int30:011> u user32!Mess
2021-11-05 23:20:46 867
原创 Windows堆
堆(HEAP)的分配,使用,回收都是通过微软的API来管理的,最常见的API是malloc和new。在往底层走一点呢,这两个函数都会调 用HeapAlloc(RtlAllocateHeap)。同样的相关函数还有HeapFree用来释放堆,HeapCreate用来创建自己的私有堆。 下面是这些函数的调用链:HeapCreate->RtlCreateHeap->ZwAllocateVirtualMemory (这里会直接申请一大片内存,至于申请多大内存,由进程PEB结构中的字段觉得,HeapSe
2021-10-20 00:29:43 922
原创 探索虚拟内存
任务管理器中各内存字段的含义:工作集(内存)专用(私有)工作集(当前进程独占)中的物理内存数量与进程正在使用且可以和其他进程共享的物理内存数量的总和。因此可以这么理解,该值就是该进程所占用的总的物理内存峰值工作集(内存)进程的工作设置(内存)的最大值,可以这么理解,因为工作设置(内存)是波动的,这个项专门记录最大的那个值。内存(专用工作集)工作集的子集,它专门描述某个进程正在使用且无法与其他进程共享的物理内存值。这个值对于一个进程来说也是最重要的,它代表了一个进程到底独占了多少物理内存。内.
2021-10-15 00:17:38 226
原创 Windows内存体系结构
在Windows系统中,每个进程都有自己的虚拟地址空间。对32位进程来说,这个地址空间的大小为4GB,这是因为32为指针可以表示从0x00000000到0xFFFFFFFF之间的任一值。他们覆盖了进程的4GB地址空间。那么Windows是如何实现这一机制的呢?虚拟地址空间的分区(即虚拟地址空间布局)进程的地址空间划分分区x86(32位 Windows)3GB用户模式下的x86 (32位Windows)X64 (64位Windows)IA-64 (64位 Windows)空
2021-10-13 23:07:13 592
原创 Windbg教程
windbg文档网页:https://docs.microsoft.com/zh-cn/windows-hardware/drivers/debugger/windbg官网:http://windbg.org/参考网站:https://www.stl-tec.de/tutorials/WinReverseEng/setup/关于工作空间工作空间保存有断点 用户定义的别名 调试器的设置 图形界面信息 调试会话状态等等信息,类似VS的项目文件,PS的工作区。命令概述WinDBG主要是以命令方式
2021-10-10 23:22:31 6543 1
原创 Windows窗口程序及其消息机制
Windows 窗口的诞生过程定义窗口类结构(WNDCLASS) -> 注册窗口类(RegisterClass) -> 创建窗口(CreateWindow) -> 显示窗口(ShowWindow) -> 更新窗口(UpdateWindow) -> 消息循环(GetMessage -> TranslateMessage ->DispatchMessage)当调用完 CreateWindow 函数的时候,应用程序实例以及相应的消息队列已经诞生了。实现代码//
2021-09-20 18:21:20 928
原创 Windows程序入口
WinMain:应用程序入口点每个Windows程序都包括名为 WinMain 或 wWinMain 的入口点函数。 下面是 wWinMain 的签名。int WINAPI wWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, PWSTR pCmdLine, int nCmdShow);这四个参数为:hInstance 称为"实例句柄"或"模块句柄"。 操作系统使用此值来标识 EXE (加载到) 可执行文件。 某些函数需要实例句柄Window
2021-09-20 13:59:35 23596
原创 二叉树的遍历
树形结构树的概念节点: 根节点、父节点、子节点、兄弟节点空树: 一棵树可以没有任何节点一棵树可以只有1个节点,也就是只有根节点子树: 左子树、右子树节点的度(degree): 子树的个数树的度: 所有节点度中的最大值叶子节点(leaf): 度为 0 的节点非叶子节点: 度不为 0 的节点层数(level): 根节点在第1层,根节点的子节点在第2层,以此类推(有些教程也从第0层开始计算)节点的深度(depth): 从根节点到当前节点的唯一路径上的节点总数节点的高度(height): 从
2021-08-15 21:46:09 113
原创 HTTP和HTTPS
什么是协议?网络协议是计算机之间为了实现网络通信而达成的一种“约定”或者”规则“,有了这种”约定“,不同厂商的生产设备,以及不同操作系统组成的计算机之间,就可以实现通信。HTTP协议是什么?HTTP协议是超文本传输协议的缩写,英文是Hyper Text Transfer Protocol。它是从WEB服务器传输超文本标记语言(HTML)到本地浏览器的传送协议。设计HTTP最初的目的是为了提供一种发布和接收HTML页面的方法。HTPP有多个版本,目前广泛使用的是HTTP/1.1版本。HTTP原理
2021-08-14 16:58:55 187
原创 TCP详解
TCP的特点TCP提供一种面向连接的、可靠的字节流服务面向连接意味着两个使用TCP的应用(通常是一个客户端和一个服务器)在彼此交换数据之前必须先建立连接在一个TCP连接中,仅有两方进行彼此通信。(UDP可以一对多:组播,广播)应用数据被分割成TCP认为最合适发送的数据块当TCP发出一段数据后,它启动一个定时器,等待目的端确认收到这个报文。如果不能及时收到一个确认,将重发这个报文段当TCP收到发自TCP连接另一端的数据,它将发送一个确认。这个确认不是立即发送,通常将推迟几分之一秒,一般是200m
2021-08-10 00:25:06 3647
原创 C++11的各种锁
Mutex(互斥锁)什么是互斥量(锁)?这样比喻:单位上有一台打印机(共享数据a),你要用打印机(线程1要操作数据a),同事老王也要用打印机(线程2也要操作数据a),但是打印机同一时间只能给一个人用,此时,规定不管是谁,在用打印机之前都要向领导申请许可证(lock),用完后再向领导归还许可证(unlock),许可证总共只有一个,没有许可证的人就等着在用打印机的同事用完后才能申请许可证(阻塞,线程1lock互斥量后其他线程就无法lock,只能等线程1unlock后,其他线程才能lock)。那么,打印机就是
2021-08-08 16:29:43 3653 1
原创 Windows socket基础
Windows socket是一套在Windows操作系统下的网络编程接口。它不是一种网络协议,而是一个开放的、支持多个协议的Windows下的网络编程接口Windows socket是以Unix socket为基础,因此Windows socket中的许多函数名与Unix都是一样的。除此之外它还允许开发人员充分利用Windows的消息驱动机制进行程序设计开发。套接字是应用层到运输层的接口。套接字用以表示一条连接的两端。每一个端点由ip和端口组成。因此套接字是由两端点的ip和端口组成。端口是运输层的概
2021-08-02 00:25:44 4382 2
原创 基于C++11实现线程池
为何需要线程池那么为什么我们需要线程池技术呢?多线程编程用的好好的,干嘛还要引入线程池这个东西呢?引入一个新的技术肯定不是为了装酷,肯定是为了解决某个问题的,而服务端一般都是效率问题。我们可以看到多线程提高了CPU的使用率和程序的工作效率,但是如果有大量的线程,就会影响性能,因为要大量的创建与销毁,因为CPU需要在它们之间切换。线程池可以想象成一个池子,它的作用就是让每一个线程结束后,并不会销毁,而是放回到线程池中成为空闲状态,等待下一个对象来使用。C++中的线程池但是让人遗憾的是,C++并没有在语
2021-07-30 00:22:42 630
原创 Windows的网络模型
windows提供了六种网络通信模型:阻塞模型、选择模型、异步选择模型、事件选择模型、重叠I/O模型、IOCP模型。异步通信同步通信IOCP原理IOCP包括三个部分:完成端口(存放重叠的I/O请求),客户端请求的处理,等待线程队列(一定数量的工作者线程,一般采用CPU*2个)线程池中的工作线程的数量与CPU内核数量相同,用它来最小化线程切换代价。一个IOCP对象,在操作系统中可关联着多个socket和文件控制端。IOCP对象内部有一个先进先出(FIFO)队列,用于存放IOCP所关联的输入输出
2021-07-28 00:01:47 1313 2
原创 C++ rb_tree红黑树
在 STL 编程中,容器是我们经常会用到的一种数据结构,容器分为序列式容器和关联式容器。两者的本质区别在于:序列式容器是通过元素在容器中的位置顺序存储和访问元素,而关联容器则是通过键 (key) 存储和读取元素。本篇着重剖析关联式容器相关背后的知识点,来一张思维导图容器分类前面提到了,根据元素存储方式的不同,容器可分为序列式和关联式,那具体的又有哪些分类呢,这里我画了一张图来看一下。关联式容器比序列式容器更好理解,从底层实现来分的话,可以分为 RB_tree 还是 hash_table,所有暴
2021-07-25 23:57:16 720 5
原创 STL 迭代器与 traits 编程技法
在 STL 编程中,容器和算法是独立设计的,容器里面存的是数据,而算法则是提供了对数据的操作,在算法操作数据的过程中,要用到迭代器,迭代器可以看做是容器和算法中间的桥梁。迭代器设计模式为何说迭代器的时候,还谈到了设计模式?这个迭代器和设计模式又有什么关系呢?在设计模式中,关于 iterator 的描述如下:一种能够顺序访问容器中每个元素的方法,使用该方法不能暴露容器内部的表达方式。而类型萃取技术就是为了要解决和 iterator 有关的问题的。在 C++ 语言里面,我们可用以下方式来简单区分一下
2021-07-24 18:26:50 99
原创 C++ 模板
C++模版的诞生程序本质是数据结构+算法,任何一门语言都可以这样理解,这个公式对计算机科学的影响程度足以类似物理学中爱因斯坦的“E=MC^2”——一个公式展示出了程序的本质。最初C++是没有标准库的,任何一门语言的发展都需要标准库的支持,为了让C++更强大,更方便使用,Bjarne Stroustrup觉得需要给C++提供一个标准库,但标准库设计需要一套统一机制来定义各种通用的容器(数据结构)和算法,并且能很好在一起配合,这就需要它们既要相对的独立,又要操作接口保持统一,而且能够很容易被别人使用(用到实
2021-07-22 00:16:02 318 5
原创 C++11多线程
线程:线程是操作系统能够进行CPU调度的最小单位,它被包含在进程之中,一个进程可包含单个或者多个线程。可以用多个线程去完成一个任务,也可以用多个进程去完成一个任务,它们的本质都相当于多个人去合伙完成一件事。多线程并发:多线程是实现并发(双核的真正并行或者单核机器的任务切换都叫并发)的一种手段,多线程并发即多个线程同时执行,一般而言,多线程并发就是把一个任务拆分为多个子任务,然后交由不同线程处理不同子任务,使得这多个子任务同时执行。C++多线程并发: (简单情况下)实现C++多线程并发程序的思路如下:将任
2021-07-21 23:37:10 425
原创 STL 配置器(allocator)
配置器:负责空间配置与管理,从实现的角度来看,配置器是一个实现了动态空间配置、空间管理、空间释放的 class template。空间配置器:整个 STL 的操作对象(所有的数值)都存放在容器之内,而容器一定需要配置空间以存放内容。什么是 allocator?allocator 有什么用?我们需要对 C++ 的 allocator 的堆内存接口调用顺序有个清晰的认识,如下图所示。allocator 堆内存管理接口 STL 的容器(eg: vector、stack、deque等)有一个共同特征,就是
2021-07-21 22:12:01 1073 3
原创 C++11随机数
在C++11之前,现有的随机数函数都存在一个问题:在利用循环多次获取随机数时,如果程序运行过快或者使用了多线程等方法,srand((unsigned)time(null))这样的设置当前系统时间为种子的方法每次返回的随机数都是一样的。而C++11中提供了真随机数做种子的方法来解决这一问题。random_device标准库提供了一个非确定性随机数生成设备.在Linux的实现中,是读取/dev/urandom设备;Windows的实现是用rand_s,使用的是操作系统来生成加密安全的伪随机数随机数生成
2021-07-21 00:34:44 1494
原创 C++处理日期和时间的chrono库
C++11 中提供了日期和时间相关的库 chrono,通过 chrono 库可以很方便地处理日期和时间,为程序的开发提供了便利。chrono 库主要包含三种类型的类:时间间隔duration、时钟clocks、时间点time point。时间间隔 duration常用类成员duration表示一段时间间隔,用来记录时间长度,可以表示几秒、几分钟、几个小时的时间间隔。duration 的原型如下:// 定义于头文件 <chrono>template< class Rep,
2021-07-18 18:13:35 1520 2
原创 C++数值类型和字符串之间的转换
在 C++11 中提供了专门的类型转换函数,程序猿可以非常方便的使用它们进行数值类型和字符串类型之间的转换。数值转换为字符串使用 to_string() 方法可以非常方便地将各种数值类型转换为字符串类型,这是一个重载函,函数声明位于头文件 中,函数原型如下:// 头文件 <string>string to_string (int val);string to_string (long val);string to_string (long long val);string to_
2021-07-18 17:29:57 416
原创 VS Code 修改用户配置的目录,防止C盘用户数据丢失
创建VS Code的快捷方式目标内指定用户配置的目录“D:\soft\VSCode\Microsoft VS Code\Code.exe” --user-data-dir “User Data”这里指定为VS Code同级目录下的User Data文件夹
2021-07-16 11:39:52 957
原创 Chrome浏览器指定用户数据的保存路径
这里将用户数据放到Chrome浏览器的当前目录我现在的浏览器路径是 D:\soft\Chrome\Application\chrome.exe选中它右键发送桌面快捷方式,将快捷方式剪切到chrome.exe同一目录右击快捷方式修改目标D:\soft\Chrome\Application\chrome.exe --user-data-dir=“User Data”–user-data-dir参数就是指定用户数据的存放目录,这里指定为当前目录的User Data文件夹然后用快捷方式打开浏览器就行了,
2021-07-16 09:57:50 4592
原创 qt.qpa.plugin: Could not find the Qt platform plugin “windows“ in ““
在 QApplication a(argc, argv); 之前设置环境变量 QByteArray qtdir = qgetenv("QTDIR"); /*QString strDir = "D:\\Qt\\myDebugQt\\myDebugQt";*/ QString strPlatforms = qtdir + QString(R"(\plugins\platforms)"); qputenv("QT_QPA_PLATFORM_PLUGIN_PATH", strPlatforms.toLoca
2021-07-14 16:34:25 338
原创 C++右值引用
右值C++11增加了一个新的类型,称为右值引用(R-value reference),标记为&&。在介绍右值引用类型之前要了解什么是左值和右值。lvalue是loactor value的缩写,rvalue是read value的缩写左值是指存储在内存中、有明确存储地址(可取地址)的数据右值是指可以提供数据值的数据(不可取地址)通过描述可以看出,区分左值和右值的便捷方法是:可以对表达式取地址(&)就是左值,否则就是右值。所有有名字的变量或对象都是左值,而右值是匿名的。右
2021-07-13 00:20:17 2043 1
原创 C++11基础特性
初始化列表C++11 添加了 initializer_list 类型,允许使用 initializer_list 初始化对象STL 容器例如 map, vector 等都实现了 initalizer_list constructor自定义的对象也可以使用 initalizer_list 作为构造函数的参数class CVector{private: std::vector<int> m_vec;public: CVector() {} CVector(const std
2021-07-02 00:03:50 175 2
WinDbg_preview_1.1910.3003.0.zip
2021-10-10
activemq-cpp编译出来的所有库包括openssl,cppunit,apr
2021-01-03
QT Player Demo
2020-12-02
PE格式解析.zip
2020-09-09
二维码识别zbar.zip
2020-04-12
botan版本2.3.0.zip
2020-04-12
WIN10-PCHunter64.zip
2020-04-05
Qt中文文档.zip
2020-04-01
二维码本地识别.zip
2020-03-27
Windows,JAVA,Android的API文档.zip
2020-03-22
Qt5.13.0 Https库.zip
2019-10-15
qrencode.zip
2019-10-07
botan-2.1.0.zip
2019-10-07
globalshortcut.zip
2019-10-04
Winhex 19.8 中文版
2019-04-28
win7,win10注入CSRSS 不蓝屏
2019-04-22
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人