简单的GDI操作

简单的GDI操作 窗口程序的本质 :GUI GDI GDI: Graphics Device Interface,图形设备接口,这是Windows提供的一组用于绘制图像的API GUI: Graphical User Interface,图形用户界面,是指用户操作软件的界面方式,以区别于字符方式 说白了 GDI是一套实打实的接口,真实存在 GUI只是一个概念 GDI 图像设备接口(Graphics Device Interface) 设备对象(HWND) DC(设备上下文,Device Contexts) 图形对象 图形对象 作用 画笔(Pen) 影响线条,包括颜色、粗细、虚实、箭头形状等 画 …

消息机制与模拟消息

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

新建一个窗口程序

新建一个窗口程序 消息机制 创建窗口的几个步骤 创建窗口类 注册窗口类 创建窗口 显示窗口 构建消息循环 创建过程 demo : https://github.com/luodaoyi/cpp_code/tree/master/MemoryInjectTool/CreateWindows //1 创建窗口类型模板 WNDCLASS wndclass = { 0 }; wndclass.lpszClassName = className; //名字 wndclass.hbrBackground = (HBRUSH)COLOR_BACKGROUND; //背景画笔句柄 …

文件系统

文件系统 什么是文件系统 文件系统是操作系统用于管理磁盘上文件的方法和数据结构,简单说就是在磁盘上如何组织文件的方法,是软件层面的东西 windows上有哪几种文件系统 类型 NTFS FAT32 磁盘分区容量 2T 512MB – 2TB (早先只有32GB) 单个文件容量 4GB以上 最大4GB EFS加密 Y N 磁盘配额 Y N 如何操作文件系统 卷相关的API API 功能 GetLogicalDrives( ) 获取卷 GetLogicalDriveString() 获取所有卷盘符字符串 GetDriveType() 获取卷的类型 GetVolumeInformation () 获 …

静态链接库

静态链接库 如何创建静态链接库 vs新建项目,选择静态链接库 在项目文件中新建 .cpp 文件与.h 文件 项目编译生成后会产生一个 .lib文件 如何使用静态链接库 将生成的.h与.lib文件复制到项目根目录 直接添加.lib与.h到项目中 在项目代码中添加头文件引用 #include "xxx.h" #pragma comment(lib,"xxx.lib") 静态链接库的生成 lib的生成和我们的exe是一样的,也是要经过预处理编译会变的过程,最终生成的lib 就是多个.o(obj)文件的集合体

进程的遍历、获取与销毁

进程的遍历、获取与销毁 创建快照遍历 //获得进程所使用的堆,模块和线程的信息快照 HANDLE WINAPI CreateToolhelp32Snapshot ( DWORD dwFlags,//标志位 DWORD th32ProcessID //进程ID ) //dwFlags: 指定的快照中,指定需要拍的系统部分 TH32CS_INHERIT 声明快照句柄是可继承的。 TH32CS_SNAPALL 在快照中包含系统中所有的 进程和线程。 TH32CS_SNAPHEAPLIST 在快照中包含ID所指定的进程的所有的堆。 TH32CS_SNAPMODULE 在快照中包含在ID所指定的进程的所 …

C语言23 终极篇 预处理之宏定义、条件编译和文件包含

什么是预处理 预处理一般是指在程序源代码被转换为二进制代码之前,由预处理器对程序源代码文本进行处理,处理后的结果再由编译器进一步编译。 预处理功能主要包括宏定义,文件包含,条件编译三部分 宏定义 简单宏: #define 标识符 字符序列 #define FALSE 0 #define NAME "LUODAOYI" #define __IN #define __OUT //极端例子 #define NAME "LUODAOYI" #define A int method() { #define B char buffer[0x10]; #define C …

C语言22 调用约定和函数指针

函数调用约定 就是告诉编译器:怎么传递参数,怎么传递返回值,怎么平衡堆栈 int method(int x,int y) { return x+y; } //调用 method(1,2); 常见的几种调用约定: 调用约定 参数压栈顺序 平衡堆栈 __cdecl 从右至左入栈 调用者清理栈 __stdcall 从右至左入栈 自身清理堆栈 __fastcall ECX/EDX 传送前两个,剩下:从右至左入栈 自身清理堆栈 int __stdcall method(int x,int y) { return x+y; } //调用 method(1,2); //观察反汇编堆栈变化 PS:一般情况下自 …

C语言21 指针数组与数组指针

指针数组的定义 char arr[10]; //10 char char* arr[10]; //10 指针(char*) Point* arr[10]; //10 指针(Point*) int******** arr[10]; 指针数组的赋值 char* a = "Hello"; char* b = "World"; //方式1: char* arr[2]= {a,b}; //方式2: char* arr[2]; arr[0]=a; arr[1]=b; 结构体指针数组 struct Point { int x; int y; } Point p; //8字节 一个结构体 Point …

C语言20 结构体指针

探测结构体指针的特性 struct Point { int x; int y; } ++、– 加法与减法 指针相减 使用结构体指针 //创建结构体 Point p; p.x=10; p.y=20; //声明结构体指针 Point* ps; //为结构体指针赋值 ps = &p; //通过指针读取数据 printf("%d \n",ps->x); //通过指针修改数据 ps->y=100; printf("%d\n",ps=>y); 结构体指针一定要指向结构体吗? struct Point { int x; int y; } int arr[10]={1,2,3,4,5,6,7,8,9,10} …

C语言19 指针取值的两种方式

一级指针和多级指针 int i =100; int* p1 = &i; int** p2 = &p1; int*** p3 = &p2; int**** p4 = &p3; int***** p5 = &p4 int****** p6 = &p5; int******* p7 = &p6; int****** px1 = *(p7); int***** px2 = *(px1); int**** px3 = *(px2); int*** px4 = *(px3); int** px5 = *(px4); int* px6 = *(px5); int px7 = *(px6); int px7 …

C语言18 指针与字符串

字符串的几种表示方式有什么区别? char str[6] = {"A","B","C","D","E","F"}; //"\0" 或者0 --堆栈中 局部变量 char str[] = "ABCDE"; //编译器末尾填0 常量区 char* str= "ABCDE"; //常量区 //打印 printf("%s \n",str); //字符串打印时 遇到 0 才会停止 常用的字符串函数 1、int strlen(char* s) 返回值是字符串S的长度,不包括结束符"/0" 弊端:字符串中英文混合的话。返回的长度有问题,因为中文占用两个字节 2、char* strcpy(char* …

C语言17 数组参数传递

基本类型参数传递 int x =1; void plus(int p) { p = p+1; } printf("%d \n",x); //x的值是多少? 数组作为参数 编写一个函数,能够打印任意整形数组的值 void PrintArray(int arr[],int nLength) {

C语言16 取值运算符

“*”的几种用途 乘法运算符 int x = 1; int y = 2; int z = x * y; 定义新的类型 char x; char* x; 取值运算符 指针类型的变量 int* a =(int*)1; printf("%x \n",(a +1)); 10: int a =(int*)1; 00401028 mov dword ptr [ebp-4],1 11: printf("%x \n",*(a +1)); 0040102F mov eax,dword ptr [ebp-4] 00401032 mov ecx,dword ptr [eax+4] 00401035 push ecx …

C语言15 取地址符号&的使用

&符号是取地址符,任何变量都可以使用&来获取地址,但不能用在常量上 struct Point { int x; int y; }; char a; short b; int c; Point p; printf("%p %p %p %p \n",&a,&b,&c,&p); printf("%x %x %x %x \n",&a,&b,&c,&p); printf("%x \n",&10); 16: char a; 17: short b; 18: int c; 19: Point p; 20: 21: printf("%p %p %p %p \n",&a,&b,&c,&p); 0040D408 …

C语言14 指针类型

C语言14 指针类型 指针是C语言中的一种数据类型, 定义带 *类型的变量 char x; char* x; short y; short* y; int z; int* z; float f; float* f; double d; double* d; Student st; Student* st; 总结: 任何带有*的变量类型的标准写法:变量类型* 变量名 任何类型都可以带* 加上* 以后是新的类型,统称为“指针类型” *可以使任意多个。 指针变量赋值 char* x; char*** x; char******* x; short* ~~ int* ~~ Student* ~~ x …

结构体 字节对齐的练习

分析结构体大小 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 struct S1 { char c1; double d; char c2; char c3; }; struct S2 { char c1; char c2; char c3; double d; }; struct S3 { char c1; S1 s; char c2; char c3; }; 分析结构体大小 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 #pragma pack(1) struct S1 { char …

C语言 13 结构体数组

结构体数组的定义 类型 变量名[常量表达式]; //定义结构体类型 struct stStudent { int Age; int Level; } //定义结构体变量 struct stStudent st; //定义结构体数组 struct stStudent arr[10]; //或者 stStudent arr[10]; 结构体数组初始化 struct stStudent{ int Age; int Level; }; struct stStudent arr[5] = {{0,0},{1,1},{2,2},{3,3},{4,4}}; //或者 arr[0].Age=100; …

C语言12 字节对齐

#include char x; short y; int check() { x =1; y=2; return 0; } int main(int argc, char* argv[]) { check(); system("pause"); return 0; } //上述代码中 check 函数的反汇编 13: x =1; 00401038 C6 05 E2 55 42 00 01 mov byte ptr [x (004255e2)],1 14: y=2; 0040103F 66 C7 05 E0 55 42 00 mov word ptr [y (004255e0)],offset …

C语言11 结构体

思考: 当需要一个容器能够存储1个字节,你会怎么做? //char 当需要一个容器能够存储4个字节,你会怎么做? //int 当需要一个容器能够存储100个2个字节的数据,你会怎么做? //short arr[100] 当需要一个容器能够存储5个数据,这5个数据中有1字节的,2字节的有10字节的。。。你会怎么做??