2018/09/17 C++ 标准模板库的 std::string 很好很强大,但是并没有提供判断一个字符串是否以另一个字符串开始/结束的接口。这里为 std::basic_string<charT> 提供这两个接口。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 //string_predicate.hpp #include <string> namespace std { template <typename charT> inline bool starts_with(const basic_string<charT>& big, …
2018/05/29 简单的GDI操作 窗口程序的本质 :GUI GDI GDI: Graphics Device Interface,图形设备接口,这是Windows提供的一组用于绘制图像的API
GUI: Graphical User Interface,图形用户界面,是指用户操作软件的界面方式,以区别于字符方式
说白了 GDI是一套实打实的接口,真实存在 GUI只是一个概念
GDI 图像设备接口(Graphics Device Interface) 设备对象(HWND) DC(设备上下文,Device Contexts) 图形对象 图形对象 作用 画笔(Pen) 影响线条,包括颜色、粗细、虚实、箭头形状等 画 …
2018/05/29 消息机制与模拟消息 消息机制 硬件产生事件 被操作系统捕获,封装成消息 操作系统发送到系统消息队列 再由操作系统由系统消息队列发送到 对应的线程内核对象中的线程消息队列 线程消息队列处理完毕后,将时间送回操作系统 由操作系统调用窗口回调函数 => WindowProc() 线程消息队列 处理
GetMessage() => 取出消息 DispathMessage() => 把消息再送回系统中系统中 在线程拿到消息之前,消息经过了两个队列
2018/05/29 新建一个窗口程序 消息机制
创建窗口的几个步骤
创建窗口类 注册窗口类 创建窗口 显示窗口 构建消息循环 创建过程 demo : https://github.com/luodaoyi/cpp_code/tree/master/MemoryInjectTool/CreateWindows
//1 创建窗口类型模板 WNDCLASS wndclass = { 0 }; wndclass.lpszClassName = className; //名字 wndclass.hbrBackground = (HBRUSH)COLOR_BACKGROUND; //背景画笔句柄 …
2018/05/04 以文件为后背存储区的内存交换文件 各种后备存储器的内存映射文件 以磁盘中文件系统的具体文件为后备存储的页交换文件(文件映射) 以页交换文件("虚拟内存")为后备存储器的页交换文件(共享内存) 页交换文件(虚拟内存) 通过CreateFileMapping api 创建文件映射内核对象,在内存中申请空间(物理内存和虚拟内存)
通过MapViewOfFile 在响应的进程虚拟内存空间中预定对应空间,并且把上一步的内存映射到进程虚拟空间中。
这样就实现了共享内存
2018/05/03 页交换文件与内存映射文件 内存的几种状态和类型 私有类型:
使用VitualAlloc申请分配/调拨内存后,申请的内存只能被当前进程使用。其他进程无法访问。这就是所谓的私有内存
映射类型 -> 页交换文件(虚拟内存)
页交换文件补充了我们的物理内存的不足。在内存中长时间不活跃的数据,系统会将内存写入页交换文件。用以节省内存,所以页交换文件也是计算机内存的一部分
2018/04/19 事件和线程同步 函数 //创建一个时间对象 HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, // SD 安全属性 BOOL bManualReset, // reset type 0自动复位(互斥)、1手动复位(通知模式) BOOL bInitialState, // initial state 初始创建时时间是否具备信号 LPCTSTR lpName // object name 对象的名称 ); //将目标事件对象设置为有信号的(同时通知其他线程) BOOL SetEvent( HANDLE hEvent // …
2018/04/12 线程的创建和控制 进程和线程的关系:进程提供资源,线程使用资源完成工作
创建线程函数 HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD /安全属性 DWORD dwStackSize, // initial stack size //线程栈大小- LPTHREAD_START_ROUTINE lpStartAddress, // thread function //线程代码 LPVOID lpParameter, // thread argument //线程参数 DWORD …
2018/04/10 句柄表和继承 句柄代表着备操作的对象
句柄的本质(handler) 句柄表可以看做一个非常大的结构体数组
句柄表的结构
索引值: 进程通过索引找到句柄表中对应的选项
内核对象地址: 通过地址直接找到对应的内核对象
访问掩码: 控制了访问权限
标志位: 标志改句柄能否被继承
句柄表是如何工作的:
每个进程的内核对象,都有一个句柄与之对应
操作对应进程,需要获得进程句柄。通过系统api操作
2018/04/09 ListView控件 实现简单进程管理 用到的相关api函数 //获取控件句柄 HWND GetDlgItem( HWND hDlg,//获得控件所处的窗口的句柄 int nIDDlgItem //控件id ); //初始化列表的列 (listview插入新的一列 int ListView_InsertColumn( HWNDhwnd, //控件的句柄 int iCol, //第几列 (索引 index const LPLVCOLUMNpcol //结构体指针 (包含新列的结构体 ); //插入新的一行条目 int ListView_InsertItem( HWND hwnd, const …
2018/04/07 进程的创建 进程的启动过程 打开目标exe的映象文件 创建进程内核对象 映射NTDLL到内存 创建线程内核对象 通知子系统对进程进行管理 启动线程初始化空间和加载其他DLL 跳转到入口处开始执行 CreateProcess api BOOL CreateProcess( LPCTSTR lpApplicationName, // name of executable module LPTSTR lpCommandLine, // command line string LPSECURITY_ATTRIBUTES lpProcessAttributes, // SD …
2018/04/06 进程和线程 什么是进程? 进程和普通计算机程序的区别 进程 是运行中的程序 进程 活在内存中 有血有肉有灵魂 程序 死在 硬盘上的 有肉没血没灵魂 如果进程是空间的概念,那么这段空间里有什么? 如果进程是空间概念,那么进程是怎么工作的? 进程和线程的关系 进程: 提供了必要的资源和空间
线程: 使用进程中的资源完成工作的工作人员
关系: 进程提供资源,线程使用资源完成工作
32位操作系统中每个进程的内存情况 操作系统是如何管理内存的 对于每个进程而言。只有低2GB的的内存空间才是可以随意使用的,高2GB的空间是系统内核所在 ,无权限的话根本不可以访问。
而且搞2GB的系统内核区域内存全局就一份 …
2018/03/01 模板 下面是一个针对int的冒泡排序
// _20180301.cpp : Defines the entry point for the console application. // #include "stdafx.h" void Sort(int* arr,int nLength) { int i,k; for (i = 0;ix > base.x && this->y > base.y; } private: int x; int y; }; template void Sort(T* arr,int nLength) { int i,k; for (i = 0;iy) return …
2018/02/23 深浅拷贝 相同类型间可以直接拷贝
// _20180212.cpp : Defines the entry point for the console application. // #include "stdafx.h" #include #include class A { private: int* a; public: A() { a = new int[10]; } virtual ~A() { delete a; printf("析构 A \n"); } }; int main(int argc,char* argv[]) { A a1; A a2; a1 = a2; return …
2018/02/16 多态的实现原理 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 #include "stdafx.h" #include #include class A { public: int x; virtual void Test() { …
2018/02/10 继承 子类从父类继承成员变量 子类从父类继承成员函数 #include "stdafx.h" class Person { public: int Age; int Sex; void Word() { printf("Person:Work"); } }; class Teacher:public Person { public: int Level; }; int main() { Teacher t; t.Age = -1; //合法但是不合理 t.Sex = 2; t.Level = 3; return 0; } 实现数据隐藏 为什么要隐藏数据成员
与前面比较,赋值的时候 合理不合法, …
2018/01/30 我们可以在什么地方创建对象? 全局变量区
Person p;
栈
void Max() { Person p; }
堆 new 和 delete
//在堆中创建对象: Person* p = new Person(); //释放对象占用的内存 delete p;
在堆中创建对象: new``delete 在C语言中我们使用malloc申请堆空间
使用完毕后使用free释放空间
C++:
class Person { private: int x; int y; public: Person() { printf("Person()执行了! \n"); } Person(int x,int y) …
2018/01/30 好的编程习惯 -定义和实现分开 代码会有更好的可读性 但不是必须的 在头文件中只留下声明代码
Test.h
struct sclass { int x; int y; int Bigger(int x,int y); int Max(int x,int y,int z); }; Test.cpp
int sclass::Bigger(int x,int y) { if(x>y) { return x; } else { return y; } } int sclass::Max(int x,int y,int z) { return Bigger(Bigger(x,y),z); } 使用: …
2018/01/28 什么是继承 struct Person { int age; int sex; }; struct Teacher { int age; int sex; int level; int classId; }; struct Teacher:Person { int level; int classId; }; 总结:
1、什么是继承?
继承就是数据的复制
2、为什么要用继承?
减少重复代码的编写
3、Person 称为父类或者基类
4、Teacher称为子类或者派生类
继承不仅仅局限于父类 struct X { int a; int b; }; struct Y:X { int c; int …
2018/01/28 什么是构造函数 #include "stdafx.h" #include struct Sclass { int a; int b; int c; int d; Sclass()//构造函数 { printf("观察这个函数 \n"); } Sclass(int a,int b,int c,int d)//构造函数 { this->a=a; this->b=b; this->c=c; this->d=d; printf("观察这个函数 2\n"); } int Plus() { return a+b+c+d; } }; int main(int argc, char* argv[]) { …