C++
尚书左仆射
我喜欢按照不按套路出牌的套路出牌。
展开
-
Centos7下使用CMake
在进行需要提供跨平台服务的项目时,最好有相应的跨平台项目构建工具。本文所述的CMake即其中比较好用的跨平台构建工具之一。下文主要以C++语言为例进行使用演示。安装C++所需的环境:yum install -y gcc gcc-c++ make automake安装wget工具:yum install -y wget下载CMake工具:wget http://www.cma...原创 2020-03-22 11:52:40 · 3774 阅读 · 0 评论 -
MFC命令传递的内部流程
我们在《MFC消息流动的内部实现》中已经看到,当消息为命令消息(WM_COMMAND)时,在CWnd::OnWndMsg中将交由OnCommand虚函数来处理。该处的OnCommand函数不一定是CWnd:: OnCommand,具体情况要视this指针所指对象而定。在MFC中以下数个类都改写了OnCommand虚函数:class CWnd : public CCmdTargetclass原创 2016-08-01 14:33:57 · 2497 阅读 · 0 评论 -
DLL的简单实现及调用
DLL(Dynamic Link Library,动态连接库)是一个可以被其他应用程序调用的应用模块,其中封装了可以被调用的资源或函数。DLL属于可执行文件,他符合Windows系统的PE文件格式,不过他的运行是依附于EXE文件创建的进程来执行的,不能单独运行。一个DLL文件可以被多个进程所装载调用。DLL是动态连接库,相对应的,是静态连接库。动态连接库是在EXE文件运行时被加载执行的,而静原创 2016-05-14 16:47:16 · 2768 阅读 · 0 评论 -
使用C++操作mysql数据库
话不多说,直接进入主题。一.环境搭建本文所述是在32位win7,VS2013,mysql5.5下的实验情况,其它环境应该也是大同小异。首先,需要安装VS2013和mysql数据库。然后,打开VS2013开始配置mysql使用环境。1、新建win32控制台程序,此处就不多说了。2、在VS2013的菜单栏选择“项目——>属性”3、配置属性——>VC++目录——>包含目录原创 2016-05-15 11:49:19 · 2833 阅读 · 1 评论 -
实现DLL的注入与卸载
在Windows系统下,为了避免各个进程相互影响,每个进程的地址空间都是被隔离的。在执行DLL注入时需要通过创建“远程线程”来实现。所谓“远程线程”,并不是跨计算机,而是跨进程的。简而言之,就是进程A在进程B中创建一个线程,这个线程就叫“远程线程”。要向其它进程中“注入”DLL就需要在目标进程中调用相应的API函数(LoadLibrary),可是目标进程不会自己“乖乖地”调用加载函数,这时候要原创 2016-05-15 19:10:53 · 9459 阅读 · 4 评论 -
实现远程代码注入
前面我写过DLL的注入代码(详见:DLL注入与卸载),但是也并非就一定要另外实现一个动态链接库再注入我们的所需操作。这次我们就直截了当一点,直接在目标进程中注入我们所需的代码来实现操控。要在目标进程中完成一定的功能,当然需要调用相关的API函数了,只是这次我们要使用的API出现在不同的DLL中。Kernel32.dll文件在每个进程中的地址是相同的,但这并不代表其他DLL文件在每个进程中的地址原创 2016-08-28 16:39:09 · 1384 阅读 · 2 评论 -
在ListCtrl控件中插入图标
在ListCttrl控件(Report风格)的使用上,有时需要向子列中插入图标,例如要制作一个下载软件,我们计划在控件的第一列用图标的形式显示下载状态:排队、下载中、出错等等,第二列计划用图标显示下载文件类型,要做出这样的效果,就必须使用CListCtrl的SetItem(八个参数)方法,由于我这台电脑上没有MSDN所以这八个参数具体都是什么意思我暂时不清楚,在这只介绍下跟我们的操作关系密切的几个转载 2016-08-06 20:45:14 · 2770 阅读 · 3 评论 -
WM_PAINT消息详解
原文地址:http://blog.sina.com.cn/s/blog_5344089201009whk.htmlWM_PAINT是Windows窗口系统中一条重要的消息,应用程序通过处理该消息实现在窗口上的绘制工作。1. 系统何时发送WM_PAINT消息? 系统会在多个不同的时机发送WM_PAINT消息:当第一次创建一个窗口时,当改变窗转载 2016-08-06 22:26:01 · 1009 阅读 · 0 评论 -
MFC中的Document-View结构
MFC之所以为Application Framework,最重要的一个特征就是它能够将管理数据的程序代码和负责显示数据的程序代码分离开来,而这种能力有Document/View提供。想要实现数据管理和显示的分离,需要搞清楚一些几个问题:1. 程序的哪个部分持有数据2. 程序的哪个部分负责更新数据3. 如何以多种方式显示数据4. 如何让数据的更改有一致性5. 如何实原创 2016-07-21 12:08:36 · 4651 阅读 · 0 评论 -
Windows钩子的使用
我们知道Windows中的窗口程序是基于消息,由事件驱动的,在某些情况下可能需要捕获或者修改消息,从而完成一些特殊的功能(MFC框架就利用Windows钩子对消息进行引导)。对于捕获消息而言,无法使用IAT或Inline Hook之类的方式去进行捕获,这就要用到接下来要介绍的Windows提供的专门用于处理消息的钩子函数。1. 挂钩原理Windows下的应用程序大部分都是基于消息机原创 2016-08-08 17:21:44 · 15982 阅读 · 1 评论 -
windows下的内联hook实现
HOOK技术正如其名,就像是代码中放下的一个“钩子”,它在静静地等待捕获系统中的某个消息或动作。在编程技术中,钩子技术在DOS时代就已经存在了。在windows下,钩子按照实现技术的不同和挂钩位置的不同,其种类也是越来越多,但是设置钩子的本质却是始终不变的。那么钩子究竟有什么用?它能干的事非常多,例如输入监控、API拦截、消息捕获、改变程序执行流程等。杀毒软件会用HOOK技术钩住一些API函数原创 2016-05-19 18:17:51 · 6304 阅读 · 5 评论 -
调皮的MFC(1)
新建一个MFC工程,集成环境会先帮我们生成一个框架。框架中用到的最重要的基础类层次结构如下所示:其中在虚矩形框中的类是我们自己继承的类,实矩形框中的类是MFC中自带的类(取自深入浅出MFC)。下面对MFC中自带的类做一些大致的说明:CObject类MFC的CObject类为程序员提供了对象诊断、运行时类型标识、序列化和动态生成等功能。(1)对象诊断:利用成员函数原创 2016-07-19 20:22:20 · 1369 阅读 · 0 评论 -
线程同步实现
线程同步是指同一进程中的多个线程相互协调工作达到一致性。当我们编写程序时,有时会使用多个代码段同时读取或修改相同地址空间中的共享数据。此时,操作系统中可能会出现一个代码段在读取数据,而另一个代码段却在修改数据的情况。这样的情况会导致程序发生读写错误,这显然不是我期望看到的。为了避免出现类似的情况,我们需要用到线程同步技术。即当一个线程对资源正在进行读写时,其它的线程则需等待。线程的同步常用的有原创 2016-08-07 16:27:40 · 574 阅读 · 0 评论 -
Ini解析 --iniparser
Iniparser是针对INI文件的解析器。ini文件则是一些系统或者软件的配置文件。Iniparser库的API可以对ini文件(配置文件)进行解析、设置、删除等操作。下载iniparser:Github:https://github.com/ndevilla/iniparser主要代码都在src目录下:其中dictionary.h里面声明了一些直接解析ini file的API...原创 2019-09-07 19:20:42 · 3194 阅读 · 0 评论 -
Xml解析 --TinyXML-2
TinyXML-2 是小巧、精简且高效的C++ XML 解析库,可以被方便地应用到其他项目中。github: https://github.com/leethomason/tinyxml2简而言之,tinyxml-2是一个xml解析器,从xml文档构建一个可以读取、修改和保存的文档对象模型(dom)。有多种方法可以访问XML数据并与之交互。TinyXML-2使用的是文档对象模型(DOM...原创 2019-09-07 19:29:50 · 934 阅读 · 0 评论 -
Json解析 --JsonCpp
1、下载scons http://sourceforge.net/projects/scons/files/scons/2.1.0/scons-2.1.0.tar.gz/download2、解压scons-2.1.0.tar.gztar-zvxf scons-2.1.0.tar.gz 3、进入到解压目录scons-2.1.0下面,执行命令:sudopython setup....原创 2019-09-07 19:40:14 · 243 阅读 · 0 评论 -
libevent+inotify实现配置文件实时读取
有些配置文件需要被频繁使用,但是又需要支持根据“场景”进行模式切换。如果每次都重新读取势必影响服务响应效率,折衷的方式是定时重新读取,比如5分钟。但最好的方式是在真正需要的时候在重新读取,即,文件修改之后。那么如何得知所关注的文件已经被修改?Inotify 是一个Linux特性,它监控文件系统操作,比如读取、写入和创建。Inotify 反应灵敏,用法非常简单,并且比 cron 任务的繁忙...原创 2019-09-07 19:49:54 · 623 阅读 · 0 评论 -
C++独孤九剑第四式——菩提无树(构造函数语意)
菩提本无树,明镜亦非台。本来无一物,何处惹尘埃!如果没有构造函数的辛勤劳作我们的编程世界也是空无一物(当然是站在面向对象的角度,也排除了一些特殊情况)。那么构造函数又是如何帮我们构造“万物”的呢?嘻嘻,人家待会儿再告诉你。先说人生三大错觉:股票要涨,房价要跌,她还爱我。使用构造函数也经常有错觉,比如:当我们没有定义任何构造函数时,编译器总是会帮我们生成默认构造函数;编译器合成的默认构造函数原创 2016-06-08 22:59:13 · 2978 阅读 · 0 评论 -
MFC消息流动的内部实现
消息的一生神秘而漫长,期间曲折多为人所不知。今天就让我们一起“撩”一下这位高冷的神秘妹纸吧。事实上,MFC中利用hook技术,把看似无关的操作关联了起来。所谓hook(钩子)是Windows中一种高级的编程技术,它可以保证,在特定情况发生的时候就转去执行我们所指定的操作(是一种霸道机关术)。MFC的hook发生在CWnd派生类对象的产生之际。在WINCORE.CPP中我们可以看到如下的代码原创 2016-07-31 22:18:53 · 2323 阅读 · 0 评论 -
调皮的MFC(2)
上回书说到,WinMain和窗口处理函数分别被相应的类操作和宏操作所取代。这次我们就来看一下,取代之后的MFC程序是如何运行的吧。先把类继承图贴出来,随时可以回顾一下。主cpp文件中的第一个操作语句:// The one and only CMyWinApp objectCMyWinApp theApp;1.生成一个对象自然是要调用构造函数的,但是不仅要调用自身的构原创 2016-07-20 15:23:19 · 2261 阅读 · 1 评论 -
C++独孤九剑第一式——拨云见日(对象内存模型)
归妹趋无妄,无妄趋同人,同人趋大有。甲转丙,丙转庚,庚转癸。子丑之交,辰巳之交,午未之交。风雷是一变,山泽是一变,水火是一变。乾坤相激,震兑相激,离巽相激······好了,要背心法的同学请课后自行背诵。 特别说明:本系列并非严格按照《独孤九剑》的剑式进行命名,来学剑招的请自备传送卷轴,恕不报销往返机票。之所以称之为“拨云见日”,就是要在这招中和大家一起揭开C++对象内存的迷雾原创 2016-05-30 20:13:16 · 2824 阅读 · 2 评论 -
C++独孤九剑第二式——众妙之门(函数处理机制)
玄之又玄,众妙之门。我们的程序都会用到函数,函数的调用过程看似简单易懂,实则“玄之又玄”(先营造一下氛围)。下面本文会对各种类型的函数进行一些探究,并和大家一起学习函数方面的知识。在正式进入函数的探究之前,先介绍一些书在讲函数时可能会碰到的两个概念。概念1:函数名称mangling即编译器会为我们的函数名加上一些修饰,使它在程序中独一无二。具体的名称修饰算法不同的编译器可能会有原创 2016-06-01 20:48:26 · 2476 阅读 · 1 评论 -
C++独孤九剑第七式——庖丁解牛(各种重载操作)
庖丁解牛,庖丁指的是编译器,而我们则是提供牛的人,牛就是被重载的操作。当编译器遇到被重载的操作,能够准确地找出合适的一个,犹如庖丁解牛,游刃有余。重载主要分为函数重载和操作符重载。函数重载应该大家都会稍微熟悉一些,操作符可能略显生疏。但是不管怎样,我们讨论完后肯定会有更深刻的理解。一、函数重载(成员或非成员)具有相同名字而形参表不同的多个函数形成了函数的重载。注意:仅返回值不同是不能形成函数重载的...原创 2016-06-23 16:59:12 · 2282 阅读 · 1 评论 -
Windows下向指定窗口模拟发送键盘消息
在操作系统中,鼠标和键盘的操作会被转换为相应的系统消息,窗口过程在接收到消息后会进行对应的处理。发送消息,我们可以使用SendMessage()和PostMessage(),所以,只要使用这两个函数来发送鼠标和键盘的相关消息就可以了。此外,还可以通过keybd_event()和mouse_event()两个专用的函数进行鼠标和键盘按键的模拟操作。下面是一个简单的向指定窗口发送消息的例子:1原创 2016-05-18 21:10:24 · 27094 阅读 · 1 评论 -
VS2013下boost环境的搭建
BOOST 编译过程比较复杂,目前为了学习 BOOST,首先得搭建BOOST 开发环境。本文中所描述的是在Windows2007的32位机下基于VS2013版本的搭建过程。首先,请自行下载boost相关安装程序。如果是 32 位,下载 boost_1_55_0-msvc-12.0-32.exe;否则, boost_1_55_0-msvc-12.0-64.exe。随后安装相应的程序,程序安装过程原创 2016-05-14 12:34:02 · 1737 阅读 · 0 评论 -
C++独孤九剑第八式——平沙落雁(运行时浅剖析)
《平沙落雁》又名《雁落平沙》,是一首汉族古琴名曲,其意在借大雁之远志,写逸士之心胸。当然,这些都是“文人雅士”的说法,其实我就是看了《笑傲江湖》,对令狐冲的“屁股向后,平沙落雁式”印象比较深罢了(~ ̄▽ ̄)~C++编译器有时会在我们不知不觉的情况下为我们做一些事情,有时候运行时的代码也许会和我们编写的代码有较大的出入。说实在的,要完全掌握C++的运行时难度颇大,所以我在本式中写的是“浅剖析原创 2016-06-25 22:05:45 · 3076 阅读 · 0 评论 -
SendMessage函数
SendMessage函数发送指定消息到一个或多个窗口。它将调用指定窗口的窗口处理过程,并且直到窗口过程处理完该消息才返回。要发送消息后马上返回,可以使用SendMessageCallback函数或SendNotifyMessage函数。要投递一个消息到线程消息队列并马上返回,可以使用PostMessage函数或PostThreadMessage函数。函数原型:LRESULT Send翻译 2016-06-11 22:17:06 · 2817 阅读 · 0 评论 -
PostMessage函数
PostMessage函数放置(投递)消息到创建指定窗口的线程所关联的消息队列中,并且不会等待相应线程处理消息,而直接返回。要将消息投递到线程所关联的消息队列,可以使用PostThreadMessage函数。函数原型:BOOL PostMessage( HWND hWnd, UINT Msg, WPARAMwParam, LPARAM翻译 2016-06-12 10:21:35 · 5580 阅读 · 0 评论 -
C++独孤九剑第三式——鱼跃于渊(多态机制实现)
鱼跃于渊,过而成龙,变幻万千。我们都知道面向对象的三大特征:1.封装 2.继承 3.多态多态是建立在前面两个特征的基础之上的,可以算得上是面向对象的“终极应用”。从小处来看,多态拥有根据不同“环境”调用不同函数的能力;从大处来看,多态可以实现类似操作系统中调用回调函数的效果(cocos2d-x框架中就利用了C++多态的特性)。在本式中,将主要和大家一起探索函原创 2016-06-06 16:45:39 · 3619 阅读 · 0 评论 -
MFC类别型录网之执行期类型识别
我们知道MFC具有运行时类型识别(RTTI)的功能,那它究竟是怎么实现的呢?在MFC的内部,它通过一个叫CRuntimeClass的数据结构以及几个特殊的宏操作来构建一个“类别型录”网,通过在运行时查询该网上的信息来判断某个对象的所属类型。CRuntimeClass该类定义于AFX.H中,内容如下:struct CRuntimeClass{// Attributes LPCS原创 2016-07-22 14:26:10 · 1046 阅读 · 0 评论 -
MFC类别型录网之对象动态创建
要实现动态生成的功能,其实利用前面建立的“类别型录”网也已经很接近了。再看一下我们依旧要用的数据结构CRuntimeClass的定义:struct CRuntimeClass{// Attributes LPCSTR m_lpszClassName; int m_nObjectSize; UINT m_wSchema; // schema number of the loaded c原创 2016-07-22 16:44:14 · 1134 阅读 · 0 评论 -
MFC消息映射机制实现
Windows程序的本质是依靠消息来维持运行的。每一个消息都有一个代码,并以WM_开头的常量表示。MFC把消息分为三大类:1.命令消息(WM_COMMAND):命令消息意味着“使用者命令程序做某些操作”。凡由UI对象产生的消息都是这种命令消息,可能来自菜单或加速键或工具栏按钮,并且都以WM_COMMAND呈现。什么样的类有资格接受命令消息?凡派生自CCmdTarget的类皆有资格。从c原创 2016-07-23 16:49:10 · 1372 阅读 · 0 评论 -
C++独孤九剑第五式——人生几何(对象复制控制)
对酒当歌,人生几何? 譬如朝露,去日苦多。人的一生可能惊涛骇浪,更可能波澜不惊,这次我们就来探讨一下“对象”(当然各位同学自己的对象不在本次讨论范围之内O(∩_∩)O,课后自己讨论吧)一生的“起起落落”,即对象的复制控制。复制控制包括三个部分:复制构造函数的调用、赋值操作符的调用、析构函数的调用。下面就这三个操作来逐一进行介绍,大家共同学习(*^-^*)一、复制构造函数复制原创 2016-06-16 17:06:38 · 2149 阅读 · 0 评论 -
C++独孤九剑第六式——洞若观火(深入对象操作)
在前面的几式中,虽说我们已经比较详细的探讨了对象的种种操作(构造、复制构造、赋值操作符、析构),但是我感觉还是差了一点深度,所以在这一式中进一步加深,直击对象内部的操作过程。真正做到“知其然,且知其所以然”。叙述终究是无法面面俱到的,但是我相信,在我们讨论的几种情况的基础上,小伙伴们也能对我们尚未探讨的情况作出正确的判断(*^-^*)一、对象直接构造1.无继承简单类对于类中全部原创 2016-06-18 17:11:33 · 2567 阅读 · 0 评论 -
C++独孤九剑第九式——以静制动(模板编程探索)
在C++编程中,抽象层次最高的应该算是模板了吧。模板是泛型编程的基础。所谓泛型编程,就是以独立于任何特定类型的方式编写代码。把相关的类型也抽象出来,使我们的代码可以适应所需要任何类型!哇塞,想想都觉得好高端,有木有(*^-^*)模板可以看成是创建特定类或者函数的蓝图或公式。模板实例化函数或者类并不是先实例化一个列表,然后再里面挑你需要的;而是在你的确需要的时候才为你实例化一个将要用到的实例。模原创 2016-06-29 21:58:45 · 3078 阅读 · 0 评论 -
win32程序概况
学习MFC之前朋友建议我先学Windows编程,的确还是有道理的,毕竟MFC把自己“裹得太严实”,如果有win32的编程经验势必可以更好地掌握MFC。所以喽,文中和大家一起分享我学习win32部分后的总结。Windows程序和操作系统之间的爱恨纠葛请看下图:1中表示的是系统消息队列。当操作系统启动并初始化时,线程Raw Input Thread(RIT)就会启动,并创系统硬件输原创 2016-07-16 22:00:05 · 1710 阅读 · 0 评论 -
C++中的set_new_handler函数
首先,namespace std中有如下定义: Typedef void (*new_handler)(); new_handler set_new_handler(new_handler new_p) throw();//C++98 new_handler set_new_handler (new_handler new_p) noexcept翻译 2016-05-25 22:11:13 · 18308 阅读 · 3 评论