
C++
lk_HIT
这个作者很懒,什么都没留下…
展开
-
如何调试windows运行时库
运行时库调试原创 2022-12-08 11:22:29 · 319 阅读 · 0 评论 -
一个函数搞定二叉树非递归前中后序遍历
一个函数搞定二叉树的非递归的前序,中序,后续遍历原创 2022-07-16 21:19:02 · 247 阅读 · 0 评论 -
三个线程轮流输出
C++ 实现三个线程轮流打印A,B,C原创 2022-06-18 08:49:48 · 201 阅读 · 0 评论 -
C++构造函数和析构函数中调用虚拟函数
C++ 析构函数 构造器 虚拟函数原创 2022-01-16 18:33:38 · 2005 阅读 · 0 评论 -
C++ 模板实现单例
#pragma oncetemplate<typename T>class Singleton{public: static T* GetInstance() { if (m_sInstance) { m_sInstance = new T(); } return m_sInstance; } Singleton(T&&) = delete; Singleton(const...原创 2021-09-07 12:31:19 · 277 阅读 · 0 评论 -
C++ 编译期确定一个类型是不是整型(_Is_any_of_v)
譬如有一个类型T,我们需要知道他是不是整数(int,short,char,long等等),有两种实现方式:第一种应该是比较容易想到的,利用模板偏特化实现。template<class T>struct My_Is_Integer{ using type = std::false_type;};template<>struct My_Is_Integer<int>{ using type = std::true_type;};tem原创 2021-07-19 20:55:15 · 1320 阅读 · 0 评论 -
C++ 虚函数表 Hook
当C++类中函数虚函数时,为了实现多态,C++类最开始地方会包含一个指针,该指针指向虚函数表,当我们修改这虚函数表里地址就达到了实现虚函数表Hook的目的。代码如下:#include "VTblHook.h"#include <iostream>#include <Windows.h>class MyBase{public: MyBase(int a,int b):m_ia(a),m_ib(b){ } virtual void __cdecl Te原创 2021-07-11 17:17:52 · 679 阅读 · 0 评论 -
虚拟内存分析
本篇文章主要目的是对进程的用户地址空间进行一个分析。先来了解一些概念:区域,块,页面。用户地址空间划分为不同的区域,然后区域划分为不同的块,块由页面组成。(如果区域是MEM_FREE,则不存在块的概念)区域中的块是该区域内连续的页面,并且具有相同的保护属性以及以相同类型的物理存储器作为后备存储器。分析用户地址空间区域,主要要用到VirtualQueryEx函数,该函数声明如下:DWORD VirtualQueryEx(HANDLE hProcess,LPCVOID pv.原创 2021-03-14 18:43:38 · 663 阅读 · 0 评论 -
异或的一个使用场景
异或符号在某些场景下使用非常方便。场景:判断两个字符组数,要么同时为空,要么同时不为空。两种实现: char name1[20] = ""; char name2[20] = "1"; //第一种判断方式 if ((name1[0] == '\0' && name2[0] == '\0') || (name1[0] != '\0' && name2[0] != '\0')) { } //第二种判断方原创 2021-03-04 09:27:18 · 405 阅读 · 0 评论 -
获取结构体某个字段地址的偏移
#define STRUCTFILEDADDR(T,Field) \(long long)(&(((T*)0)->Field))原创 2021-02-18 08:44:17 · 296 阅读 · 0 评论 -
std::set存储自定义结构体时,如何定义比较函数
#include <iostream>#include <set>struct MyStr{ int a; int b; int c;};struct MyStrCmp{ bool operator()(const MyStr& my1, const MyStr& my2)const { if (my1.a != my2.a) return my1.a < my2.a; .原创 2020-11-22 21:05:44 · 1207 阅读 · 0 评论 -
非侵入C++ ORM
最近工作中需要将一些信息保存到数据库,由于使用的是C++,没有反射机制,所以对应的ORM库非常少,手写sql又非常麻烦,这个时候非常羡慕java,C#等语言可以在编译的时候就将字段信息等编译到可执行文件中,因此可以非常轻松的实现反射,也有非常多好用成熟的ORM库。本文主要是利用C++的宏和模板来实现非侵入式简单的C++ORM的功能(主要是针对sqlite数据库)(1)要利用C++实现反射,最主要的是可以获取C++结构体各个字段的字段名,字段类型。我在网上找到一段如下的宏可以很好的解决这个问题。原创 2020-08-10 21:08:52 · 1401 阅读 · 6 评论 -
介绍一个VS插件TimeStampMargin,可以打印output中输出时间戳
1 安装TimeStampMargin,该插件是免费的,在Vs中的插件管理中直接搜索就好了。2 由于它是对output中输入的内容显示时间,因此需要使用OutputDebugString这个函数在output中打印信息3 使用OutputDebugString需要引入两个头文件windows.h,debugapi.h,仅仅debugapi.h不行,因为该头文件中需要的宏在windows.h...原创 2020-04-12 15:51:18 · 740 阅读 · 0 评论 -
C++统计程序运行时间的类
这个类统计代码真正运行的时间,如果代码运行过程中cpu被剥夺了,那么被剥夺的那段时间是不计算在内的。class CStopwatch{public: CStopwatch() { Start(); } __int64 Now() const { LARGE_INTEGER liPerNow; QueryPerformanceCounter(&liPerNo...原创 2020-02-29 19:42:01 · 706 阅读 · 0 评论 -
远程线程注入DLL-读取指定进程中的模块
步骤:(1)用VirtualAllocEx函数在远程进程的地址空间中分配一块内存(2)用WriteProcessMemory把函数DLL的路径名字复制到第一步分配的内存中(3)用GetProcAddress函数来得到LoadLibraryW或LoadLibraryA函数在Kernel32.dll中的实际地址解释下为什么可以这么做:*为什么可以直接用GetProcAddress获...原创 2020-02-08 12:56:24 · 1285 阅读 · 0 评论 -
在CUI程序中调用GetMessage可以正常使用吗?
可以,调用GetMessage之后该线程转换为GUI线程,有自己的消息队列。创建一个子线程,然后通过各自的消息队列来实现线程之间消息的传递。#include "framework.h"#include <string>#include <iostream>#define MSG_USER_OK 1234#define MSG_USER_EXIT ...原创 2020-02-07 09:36:36 · 280 阅读 · 0 评论 -
windows挂钩注入DLL---获取桌面上所有图标名称及位置
(1)HHOOK是全局唯一的,可以跨进程使用(2)当创建钩子指定的函数第一次执行的时候,会创建一个线程(3)当一个线程调用GetMessage的时候会转换为GUI线程,会有一个对应的消息队列,可以通过这个消息队列来传递我们的指令(4)往某一个指定线程发送消息用PostThreadMessage(5)当卸载钩子的时候,要确保我们在钩子函数中创建的消息退出,因为卸载钩子会导致DLL卸载...原创 2020-02-06 21:18:33 · 607 阅读 · 3 评论 -
利用IO完成端口实现文件复制
首先实现一个句柄自动关闭的类EnsureCloseFile以下是头文件#pragma once#include <windows.h>class EnsureCloseFile{public: EnsureCloseFile(HANDLE hHandle); ~EnsureCloseFile(); EnsureCloseFile(const EnsureCl...原创 2020-01-04 20:45:22 · 381 阅读 · 0 评论