分类 CPP articles

C++ 标准库中缺少的字符串函数:`starts_with` 和 `ends_with`

C++ 标准模板库的 std::string 很好很强大,但是并没有提供判断一个字符串是否以另一个字符串开始/结束的接口。这里为 std::basic_string<charT> 提供这两个接口。 //string_predicate.hpp #include <string> namespace std { template <typename charT> inline bool starts_with(const basic_string<charT>& big, const basic_string<charT>& small) { if (&big == &small) return true; const typename basic_string<charT>::size_type big_size = big.size(); const typename basic_string<charT>::size_type small_size = small.size(); const bool valid_ = (big_size >= small_size); const bool starts_with_ = (big.compare(0, small_size, small) == 0); return valid_ and starts_with_; } template <typename charT> inline bool ends_with(const basic_string<charT>& big, const basic_string<charT>& small) { if (&big == &small) return true; const typename basic_string<charT>::size_type big_size = big.size(); const……

Continue reading

简单的GDI操作

简单的GDI操作 窗口程序的本质 :GUI GDI GDI: Graphics Device Interface,图形设备接口,这是Windows提供的一组用于绘制图像的API GUI: Graphical User Interface,图形用户界面,是指用户操作软件的界面方式,以区别于字符方式 说白了 GDI是一套实打实的接口,真实存在 GUI只是一个概念 GDI 图像设备接口(……

Continue reading

消息机制与模拟消息

消息机制与模拟消息 消息机制 硬件产生事件 被操作系统捕获,封装成消息 操作系统发送到系统消息队列 再由操作系统由系统消息队列发送到 对应的线程内核对象中的线程消息队列 线程消息队列处理完毕后,将时间送回操作系统 由操作系统调用窗口回调函数 => WindowProc() 线程消息队列 处理 GetMessage() => 取出消息 DispathMessage() => 把消息再送回系统中系……

Continue reading

新建一个窗口程序

新建一个窗口程序 消息机制 创建窗口的几个步骤 创建窗口类 注册窗口类 创建窗口 显示窗口 构建消息循环 创建过程 demo : https://github.com/luodaoyi/cpp_code/tree/master/MemoryInjectTool/CreateWindows //1 创建窗口类型模板 WNDCLASS wndclass = { 0 }; wndclass.lpszClassName = className; //名字 wndclass.hbrBackground = (HBRUSH)COLOR_BACKGROUND; //背景画笔句柄 wndclass.hInstance = hInstance; //窗口过程的实例句柄 wndclass.lpfnWndProc = WndProc; //窗口过程函数 //2 注册窗口 RegisterClass(&wndclass); //3 创建窗口 HWND hwindows = CreateWindow(className, TEXT("MYWINDOWS"), WS_OVERLAPPEDWINDOW, 500, 300, 300, 250, NULL, NULL, hInstance,NULL); //创建窗口……

Continue reading

以文件为后背存储区的内存交换文件

以文件为后背存储区的内存交换文件 各种后备存储器的内存映射文件 以磁盘中文件系统的具体文件为后备存储的页交换文件(文件映射) 以页交换文件("虚拟内存")为后备存储器的页交换文件(共享内存) 页交换文件(虚拟内存) 通过CreateFileMapping api 创建文件映射内……

Continue reading

页交换文件与内存映射文件

页交换文件与内存映射文件 内存的几种状态和类型 私有类型: 使用VitualAlloc申请分配/调拨内存后,申请的内存只能被当前进程使用。其他进程无法访问。这就是所谓的私有内存 映射类型 -> 页交换文件(虚拟内存) 页交换文件补充了我们的物理内存的不足。在内存中长时间不活跃的数据,系统会将内存……

Continue reading

事件和线程同步

事件和线程同步 函数 //创建一个时间对象 HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, // SD 安全属性 BOOL bManualReset, // reset type 0自动复位(互斥)、1手动复位(通知模式) BOOL bInitialState, // initial state 初始创建时时间是否具备信号 LPCTSTR lpName // object name 对象的名称 ); //将目标事件对象设置为有信号的(同时通知其他线程) BOOL SetEvent( HANDLE hEvent // handle to event //目标事件的句柄 ); //将目标事件对象设置为……

Continue reading

线程的创建和控制

线程的创建和控制 进程和线程的关系:进程提供资源,线程使用资源完成工作 创建线程函数 HANDLE CreateThread( LPSECURITY_ATTRIBUTES lpThreadAttributes, // SD /安全属性 DWORD dwStackSize, // initial stack size //线程栈大小- LPTHREAD_START_ROUTINE lpStartAddress, // thread function //线程代码 LPVOID lpParameter, // thread argument //线程参数 DWORD dwCreationFlags, // creation option //创建标识 LPDWORD lpThreadId // thread identifier //线程id ); 线程的控制 //线程等待 //等待一个 DWORD WaitForSingleObject( HANDLE hHandle, // handle to object……

Continue reading

句柄表和继承

句柄表和继承 句柄代表着备操作的对象 句柄的本质(handler) 句柄表可以看做一个非常大的结构体数组 句柄表的结构 索引值: 进程通过索引找到句柄表中对应的选项 内核对象地址: 通过地址直接找到对应的内核对象 访问掩码: 控制了访问权限 标志位: 标志改句柄能否被继承 句柄表是如何工作的: 每个进程的内……

Continue reading

ListView控件

ListView控件 实现简单进程管理 用到的相关api函数 //获取控件句柄 HWND GetDlgItem( HWND hDlg,//获得控件所处的窗口的句柄 int nIDDlgItem //控件id ); //初始化列表的列 (listview插入新的一列 int ListView_InsertColumn( HWNDhwnd, //控件的句柄 int iCol, //第几列 (索引 index const LPLVCOLUMNpcol //结构体指针 (包含新列的结构体 ); //插入新的一行条……

Continue reading