windows程序基础

一、windows程序基础

1. Windows程序的特点

1)用户界面统一、友好
2)支持多任务:允许用户同时运行多个应用程序(窗口)
3)独立于设备的图形操作
        使用图形设备接口( GDI, Graphics Device Interface )屏蔽了不同硬件设备的差异,提供了设备无关的图形输出能力
4)队列化消息输入,支持队列特征的消息驱动模型
        把从键盘、鼠标等输入设备接收的输入信息放入应用程序的队列中; Windows操作系统管理队列;应用程序需要输入信息时,不读硬件端口,只读消息队列。
5)事件驱动的程序设计
        - Windows程序由事件的发展控制,允许程序的用户用各种合理的顺序来安排程序的流程。
6)资源共享
        -各个应用程序共享系统提供的资源,包括设备上下文、画刷、画笔、字体、对话框、图标、定时器、通信端口。

7)程序和资源分开
        -菜单、对话框、位图等可视对象被单独分离出来加公的,全部资源定义都放在资源文件中(通常以.rc为后缀名)
8)支持应用程序间的数据交换

2. 一个简单的Windows应用程序
#include <windows.h>
int WINAPI WinMain (HINSTANCE hInstance, HINS TANCE
hPrevInstance, LPSTR IpCmdLine, int nCmdShow)
{
MessageBox (NULL, "你好,我的Visual C++世界! ", "问候",MB_ OKCANCEL);
return 0 ;
}

运行结果:

3.事件及事件驱动

●Windows系统也叫事件驱动的系统。当用户按下一个键、移动鼠标或单击鼠标按钮时,计算机通知Windows系统已经发生了一一个事件,以及事件的种类、发生的时间、发生的位置(如坐标值)。
●事件通常以下列三种方式产生:
        -通过输入设备,如键盘和鼠标;
        -通过屏幕上可视的对象,如菜单、工具栏按钮、动条和对话框上的控件;
        -来自Windows内部,如当一个后面的窗口显示到窗口前面时。

基于事件驱动的程序模型

 4.消息

        ●当Windows捕获一 条事件后 ,它会编写一条消息,将相关信息放入一个数据结构MSG中,然后将包含此数据结构的消息发给需要消息的程序。。
        ●消息处理是Windows应用程序的核心。

        ●消息是操作系统通知应用程序某件事情已经发生的一种方式。

        ●Windows消息是在Windows.h文件中用宏定义的常数。
        ●消息常数名常以WM_ 开头,格式为WM_XX。

(1)Windows消息来源
Windows应用程序的消息来源于以下四种:
(1)输入消息:键盘和鼠标的输入。此类消息先放在系统消息队列中,然后由Windows将它们送入应用程序消息队列中,由应用程序来处理消息。
(2)控制消息:与Windows的控制对象,如列表框、复选框等进行双向通信。这类消息一般不经过应用程序的消息队列,而是直接发送到控制对象。
(3)系统消息:对程序化的事件或系统时钟中断作出的一些反应。
(4)用户消息:程序员自己定义并在应用程序中主动发生的,一般由应用程序的某一部分内部处理。
        VC+ +存在几种系统定义的消息分类,不同的前缀符号经常用于识别不同的消息类,系统定义的消息宏前缀如下:
        BM :按钮控制消息
        CB :组合框控制消息
        DM :默认下压式按钮控制消息
        EM :编辑控制消息
        LB :列表框控制消息
        SBM :滚动条控制消息
        WM :窗口控制消息

(2)Windows消息数据结构
        消息号:由事先定义好的消息名标识
        字参数(wParam) :用于提供消息的附加信息
        长字参数(IParam) :用于提供消息的附加信息

Windows消息的数据结构

typedef struct tagMSG 
{
HWND hwnd; //窗口句柄,为nul则可检索所有驻留在消息队交中的消息
UINT message; //消息值,由Windows h头文件中的宏定义标识
WPARAM wParam; //包含有关消息的附加信息,不同消息其值不同
LPARAM IParam;
DWORD time; 1指定消息送至队列的时间
POINT p:/消息发送时屏幕光标位置,POINT是一个结构体
}MSG;

        注意:字参与长字参是作为消息的附加信息的,它与具体消息号的值有关;Windows中消息用结构体MSG表示;DWORD是32位无符号整型;

        POINT是一个结构体:

typedef struct tagPOINT
{
LONGX;
LONG y; 
}POINT,

二、消息队列和API

1. Windows消息队列 

        ●当产生某消息时,该消息进入消息队列,操作系统根据消息提供的信息值决定由哪个应用程序来处理;

        ●应用程序按一定的方式查找应用程序中各个类的消息映射(一组宏,用来确定某个消息及相应的处理程序;的对应关系) ;

        ●找到处理程序后,由处理程序执行相应的操作。

        ●消息队列是一一个系统定义的内存块,用于临时存储消息,或把消息直接发给窗口函数。
        ●每个窗口维护自己的消息队列,并从队列中取出消息,利用窗口函数进行处理。

2. Windows程序常用消息

( 1 )标准Windows消息(前缀为WM_ )
        分为三类:鼠标消息、键盘消息和窗口消息
 (2)控件消息
        控件或其他子窗口向父窗口发送WM_ COMMAND消息

(3 )命令消息
        菜单项、工具栏按钮、加速键等用户界面对象发送的WM_ COMMAND消息。

●焦点消息: WM_ SETFOCUS,WM_ KILLFOCUS
●定时器消息: WM_ TIMER

        ( 1 )标准Windows消息- -鼠标消息

                -WM_ LBUTTONDOWN :单击鼠标左键时产生的消息
                -WM_ LBUTTONUP :放开鼠标左键时产生的消息
                -WM_ RBUTTONDOWN ;单击鼠标右键时产生的消息
                -WM_ RBUTTONUP :放开鼠标右键时产生的消息
                -WM_ LBUTTONDBLCLK :双击鼠标左键时产生的消息

                -WM_ RBUTTONDBLCLK :双击鼠标右键时产生的
                -WM_ MOUSEMOVE :鼠标在窗C中移动时产生的

        ( 1 )标准Windows消息- -键盘消息
        -WM_KEYDOWN :按下一一个非系统键时产生的消息,附加信息参数wParam为按下键的虚拟键码,虚拟键码用以标识按下或释放的键, IParam记录按键的重复次数、扫描码等状态信息;
        - WM_KEYUP :弹起一个非系统键时产生的消息
        - WM_CHAR :按下一个非系统键时产生的消息加信息参数wParam为按下键的ASCII码,IPare的意思同上;
        ( 1 )标准Windows消息- -窗口消息
                - WM_CREATE : CreateWindows函数产生的消息;
                -WM_CLOSE :关闭窗口时产生的消息;
                - WM_DESTROY :消除窗口时由DestroyWindows()发出的消息
                - WM_QUIT :退出应用程序时由PostQuitMessage()发出的消息
                - WM_ PAINT ; Windows系统需重绘时产生的消息。
               - WM_ SIZE
                - WM_MOVE

3.对象与句柄

        ●句柄是代表某些资源的一个4字节长的数值,用于标识应用程序中不同的对象和同类对象中不同的实例

        ●所有的句柄类型以H开头。常见Windows对象的句柄:

4.关于API

        ●应用程序是如何通知操作系统执行某个功能的呢?
                -应用程序要完成某个功能是以函数调用的形式实现;
                -同样,应用程序也是以函数调用的方式来通知操作系统执行相应的功能的。

        ●操作系统把它所能够完成的功能以函数的形式提供给应用程序使用,应用程序对这些函数的调用就叫做系统调用。
        ●这些函数的集合就是Windows操作系统提供给应用程序编程的接口(Application Programming Interface),简称Windows API。如CreateWindow()函数。

        ●API是大量函数加上数字常量、宏、结构、类型以及其它相关项的集合。

        ●大多数API函数定义在Windows.h的文件中,也可以从Windows平台软件开发包( SDK )中得到。

        ●根据Windows API函数的功能,可以将其分为三类

                (1)管理函数:实现窗口的创建、移动和修改功能
                (2)图形设备函数:实现与设备无关的图形操作功能
                (3)系统服务函数:实现与操作系统有关的多种功能

三、Win32程序结构

1、Win32程序结构-WinMain函数

Win32程序示例
        例5-1创建一个如图所示的Windows窗口。 本例的目的在于说明创建Windows应用程序的方法、过程及消息的使用。

注意:●LRESULT 选择"右键/ Go To Definition"可查看定义

        ●对于CALLBACK,表示函数调用方式,_stdcall 与_ cdecl是两种不同的函数调用约定,区别在函数参数入栈的顺序,由调用函数还是被调用函数将参数弹出栈,以及产生函数修饰名的方法。

1. WinMain函数

功能:
        (1)注册窗口类,建立窗口及执行其他必要的初始化工作。
        (2)进入消息循环,根据从消息队列中接收的消息,调用相应的处理过程。
        (3)当消息循环检索到WM_ QUIT消息时,终止程序拟

 WinMain函数有三个基本的组成部分:函数说明、初始化和消息循环。

1) WinMain函数:函数说明

int WINAPI WinMain
( HINSTANCE hThisInst, ||应用程序当前实例句柄
HINSTANCE hPrevInst,   ||应用程序其他实例句柄
LPSTR IpszCmdLine,     ||指向程序命令行参数的指针
int nCmdShow     ||应用程序开始执行时窗口显示方式的整数值标识,如最大化显示或最小化显示或隐藏显示
)

2)创建一个完整的窗口需要经过下面四个操作步骤:

 初始化--窗口类的定义

typedef struct tagWNDCLASS
{
UINT style;    //窗口类的样式,一般设置为0
WNDPROC *IpfnWndProc; //定义指向窗口函数的指针
int cbClsExtra;    //窗口类变量占用的存储空间
int cbWndExtra;    //实例变量占用的存储空间
HINSTANCE hInstance;    //该类的应用程序的实例句柄
HICON hIcon;    //图标,调用Loadlcon
HCURSOR hCursor;    //光标,调用L oadCursor
HBRUSH hbrBackground; //背景刷,调用GetStockObject
LPCTSTR lpszMenuName; //窗口类菜单资源名
LPCTSTR IpszClassName; //窗口类名
}WNDCLASS;

案例的窗口类定义代码:

//窗口类的定义
WNDCL ASS wndclass ;    //窗口类对象
wndclass .style=0;    //窗口类型为缺省类型
wndclass. lpfnWndProc=WndProc; //定 义窗口处理函数名
wndclass.cbClsExtra=0;    //窗口类无扩展
wndclass.cbWndExtra=0;    //窗口实例无扩展
wndclass. hInstance=hInstance; //当前实例句柄
wndclass.hlcon=L oadlcon(NULL,IDI_APPLICATION);    //窗口的最小化图标为缺省图标
wndclass. hCursor=L oadCursor(NULL,IDC_ARROW);    //窗口采用箭头光标 
wndclass. hbrBackground=(HBRUSH)GetStockObject(WHITE_BRUSH); //窗口背景为白色
wndclass.IpszMenuName=NULL; //窗口中无菜单
wndclass. IpszClassName=lpszClassName;//窗类名

Loadlcon:在应用程序中加载一个窗口图标。 原型:HICON Loadlcon(HINSTANCE hInstance, LPCTSTR IplconName )

        其中第一个参数(HINSTANCE hInstance)表示图标资源所在的模块句柄,NULL则使用系统预定义图标;第二个参数(LPCTSTR IplconName)表示图标资源名或系统预定义图标标识名

 应用程序调用函数GetStockObject获取系统提供的背景刷HBRUSH GetStockObject(int nBrush)

 窗口注册代码:

//窗口类的注册
if(!RegisterClass( &wndclass)) //如果注册失败则发出警告
{ MessageBeep(0);
return FALSE;
}

窗口创建:

//创建窗口
HWND hwnd;//窗口句柄
hwnd = CreateWindow
(IpszClassName,        //窗口类名
IpszTitle,         //窗口实例的标题名,
WS_ OVERLAPPEDWINDOW, //窗口的风格
CW_ USEDEFAULT,     //窗口左 上角坐标为缺省值
CW_ USEDEFAULT,
CW USEDEFAULT,    //窗口的高和宽为缺省值
CW USEDEFAULT,
NULL,        //此窗口无父窗口
NULL,        //此窗口 无主菜单
hInstance,     //创建此窗口的应用程序的当前句柄
NULL        //不使用该值
),

创建一个窗口类的实例由函数CreateWindow()实现

HWND CreateWindow
(LPCTSTR IpszClassName, ||窗口类名
LPCTSTR IpszTitle, || 窗口标题名
DWORD dwStyle, || 创建窗口的样式,如下页表所示
int x,y,    ||窗口左上角坐标
int nWidth,nHeight, ||窗口宽度和高度
HWND hwndParent, ||无父窗口则为NULL
HWENU hMenu, ||窗口主菜单句柄
HINSTANCE hInstance, || 创建窗的应用程序当前句柄
LPVOID IpParam ||创建窗口时指定的额外参数
)

常用窗口样式

运用样式方法:#define WS_OVERL APPEDWINDOW(WS OVERL APPED | WS_ CAPTION | WS_ SYSMENUIWS THICKFRAME | WS MINIMIZEBOX | WS MAXIMIZEBOX)
显示窗口:

//显示窗口
ShowWindow( hwnd, nCmdShow);
//立即发送WM_ PAINT消息来刷新窗口客户区
UpdateWindow(hwnd);

消息循环:

//消息循环
MSG Msg;//消息
while( GetMessage(&Msg,NULL,0,0))
{ TranslateMessage( &Msg); //将虚拟键消息转换为字符消息
DispatchMessage( &Msg);    //调度一个消息给窗口程序。通常调度从GetMessage取得的消息
return Msg.wParam; //消息循环结束即程序终止时将信息返回
}

整合的窗口代码:

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
int WINAPI WinMain(HINS TANCE hInstance,HINSTANCE
hPrevInst,LPSTR IpszCmdLine,int nCmdShow)
{ WNDCL ASS wndclass ; //窗口类的定义...           //为窗口类结构体中的成员赋值
RegisterClass( &wndclass));
CreateWindow(...);
ShowWindow( hwnd, nCmdShow);
UpdateWindow(hwnd);
//消息循环
MSG Msg;//消息
while( GetMessage(&Msg,NULL,0,0))
{ TranslateMessage( &Msg); //将虚拟键消息转换为字符消息
DispatchMessage( &Msg);    //调度一个消息给窗口程序。通常调度从GetMessage取得的消息
return Msg.wParam; //消息循环结束即程序终止时将信息返回
}

3) WinMain函数:消息循环

 函数GetMessage():返回零值,即检索到WM_QUIT消息,程序结束循环并退出

GetMessage
( lpMSG, //指向MSG结构的指针 ,
//它包含有从应用程序消息队列中检索到的一条消息数据
hwnd, //指定为哪个窗口检索消息,若为NULL,
//则检索调用该函数的应用程序的所有消息
nMsgFilteMin, /指定检索在Min和Max范围内的消息
nMsgFilterMax
//若这两个参数都为零,该函数检索所有的可用的消息
)

函数TranslateMessage(&Msg):将原始键盘消息WM_KEYDOWN和WM_ KEYUP转化为字符(WM_CHAR)消息

函数DispatchMessage(&Msg):将消息传送到指定窗口函数

2.窗口函数WndProc

        WndProc定义了应用程序对接收到的不同消息的响应;它包含了对各种可能接收到的消息的处理过程。        

        ●WndProc函数由一个或多个switch语句组成。
        ●每一条case语句对应一种消息,当应用程序接收到一个消息时,相应的case语句被激活并执行相应的响应程序模块。

LRESULT CALLBACK WndProc( HWND hwnd, UINT
messgae, WPARAM wParam,LPARAM IParam )
{.
..
switch(message)    || message为标识的消息
{ case....break;
..case WM_ DESTROY:PostQuitMessage(0); break; default:return
DefWindowProc(hwnd,message,wParam,IParam);    //为未定义处理过程的消息提供缺省处理
}
return(0); 
}

        在消息处理程序段中一般都有对WM_ DESTROY的处理,该消息是关闭窗口时发出的。它向应用程序发出WM_ QUIT消息,请求退出处理函数:
        void PostQuitMessage(int nExitCode)        //nExitCode为应用程序的退出代码

案例窗口函数:

// 窗口(消息)处理函数
LRESULT CALL BACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM IParam)
{HDC hdc; // 设备描述表的句柄switch (message){case WM_PAINT:PAINTSTRUCT ps;hdc = BeginPaint(hWnd, &ps);TextOut(hdc, 0, 0, "武汉理工大学理学院", strlen("武汉理工大学理学院"));EndPaint(hWnd, &ps);break;case WM_CHAR:char szChar[20];sprintf(szChar, "char %C is %d", wParam, wParam); // 格式输出内容到szCharMessageBox(hWnd, szChar, "显示", 0);break;case WM_LBUTTONDOWN:MessageBox(hWnd, "mouse left clicked", "提示", 0);hdc = GetDC(hWnd);TextOut(hdc, 0, 50, "物理系电信科", strlen("物理系电信科"));ReleaseDC(hWnd, hdc);break;case WM RBUTTONDOWN:MessageBox(hWnd, "mouse right clicked", "提示", 0);hdc = GetDC(hWnd);TextOut(hdc,0, 100, "物理系光信科" ,strlen("物理系光信科");ReleaseDC(hWnd, hdc);case WM_CLOSE:if(IDYES==MessageBox(hWnd, "是否真的结束?", "关闭提示",MB_YESNOCANCEL))DestroyWindow(hWnd);break;case WM_DESTROY:PostQuitMessage(0); //调用PostQuitMessage发出WM_ QUIT消息break;default:    //缺省时采用系统消息缺省处理函数return DefWindowProc(hWnd,message,wParam,lParam);}return (0);
}

Windows程序和消息的基本流程:

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/36342.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

LVGL学习笔记 30 - List(列表)

目录 1. 添加文本 2. 添加按钮 3. 事件 4. 修改样式 4.1 背景色 4.2 改变项的颜色 列表是一个垂直布局的矩形&#xff0c;可以向其中添加按钮和文本。 lv_obj_t* list1 lv_list_create(lv_scr_act());lv_obj_set_size(list1, 180, 220);lv_obj_center(list1); 部件包含&…

Android:换肤框架Android-Skin-Support

gihub地址&#xff1a;https://github.com/ximsfei/Android-skin-support 样例&#xff1a; 默认&#xff1a; 更换后&#xff1a; 一、引入依赖&#xff1a; // -- 换肤依赖implementation skin.support:skin-support:4.0.5// skin-supportimplementation skin.support:ski…

Rust语法:变量,函数,控制流,struct

文章目录 变量可变与不可变变量变量与常量变量的Shadowing标量类型整数 复合类型 函数控制流if elseloop & whilefor in structstruct的定义Tuple Structstruct的方法与函数 变量 可变与不可变变量 Rust中使用let来声明变量&#xff0c;但是let声明的是不可变变量&#x…

双色球彩票系统---(java实现)

双色球彩票系统&#xff1a;需求&#xff1a;投注号码由6个红色号码和1个蓝色球号码组成。红色球号码从1-33中选择&#xff0c;蓝色球号码从1-16当中选择 * 红 蓝 * 一等奖 6 1 * 二等奖 6 0 * 三等奖 5 1 * 四等奖 5 0 * 4 1 * 五等奖 4 0 * …

Blazor简单教程(1.1):Razor基础语法

文章目录 前言基本文件配置引入Layout组件 语法介绍pagecodeRazor 语法[ 显式表达和隐式表达](https://learn.microsoft.com/zh-cn/aspnet/core/mvc/views/razor?viewaspnetcore-7.0#explicit-razor-expressions) 绑定简单绑定双向绑定带参数的函数绑定 依赖注入 前言 Blazor…

QT:UI控件(按设计师界面导航界面排序)

基础部分 创建新项目&#xff1a;QWidget&#xff0c;QMainWindow&#xff0c;QDialog QMainWindow继承自QWidget&#xff0c;多了菜单栏; QDialog继承自QWidget&#xff0c;多了对话框 QMainWindow 菜单栏和工具栏&#xff1a; Bar: 菜单栏&#xff1a;QMenuBar&#xff0…

A Survey for In-context Learning

A Survey for In-context Learning 摘要&#xff1a; 随着大语言模型(LLMs)能力的增长&#xff0c;上下文学习(ICL)已经成为一个NLP新的范式&#xff0c;因为LLMs仅基于几个训练样本让内容本身增强。现在已经成为一个新的趋势去探索ICL来评价和extrapolate LLMs的能力。在这篇…

微服务06-分布式事务解决方案Seata

1、Seata 概述 Seata事务管理中有三个重要的角色: TC (Transaction Coordinator) - **事务协调者:**维护全局和分支事务的状态,协调全局事务提交或回滚。 TM (Transaction Manager) - **事务管理器:**定义全局事务的范围、开始全局事务、提交或回滚全局事务。 RM (Resourc…

Java地图专题课 基本API BMapGLLib 地图找房案例 MongoDB

本课程基于百度地图技术&#xff0c;由基础入门开始到应用实战&#xff0c;适合零基础入门学习。将企业项目中地图相关常见应用场景的落地实战&#xff0c;包括有地图找房、轻骑小程序、金运物流等。同时讲了基于Netty实现高性能的web服务&#xff0c;来处理高并发的问题。还讲…

JVM垃圾回收篇-垃圾回收算法

JVM垃圾回收篇-垃圾回收算法 标记清除&#xff08;Mark Sweep&#xff09; 概念 collector指的就是垃圾收集器。 mutator是指除了垃圾收集器之外的部分&#xff0c;比如说我们的应用程序本身。 mutator的职责一般是NEW(分配内存)、READ(从内存中读取内容)、WRITE(将内容写入内…

vscode搭建c语言环境问题

c语言环境搭建参考文章:【C语言初级阶段学习1】使用vscode运行C语言&#xff0c;vscode配置环境超详细过程&#xff08;包括安装vscode和MinGW-W64安装及后续配置使用的详细过程&#xff0c;vscode用户代码片段的使用&#xff09;[考研专用]_QAQshift的博客-CSDN博客 问题如下:…

[C++ 网络协议] 套接字和地址族、数据序列

目录 1. 套接字 1.1 在Linux平台下构建套接字 1.1.1 用于接听的套接字(服务器端套接字) 1.1.2 用于发送请求的套接字(客户端套接字) 1.2 在Windows平台下构建套接字 1.2.1 Winsock的初始化 1.2.2 用于接听的套接字(服务器端套接字) 1.2.3 用于发送请求的套接字(客户端套…

pytest框架快速进阶篇-pytest前置和pytest后置,skipif跳过用例

一、Pytest的前置和后置方法 1.Pytest可以集成unittest实现前置和后置 importunittestimportpytestclassTestCase(unittest.TestCase):defsetUp(self)->None:print(unittest每个用例前置)deftearDown(self)->None:print(unittest每个用例后置)classmethoddefsetUpClass…

jmeter中用户参数和用户定义的变量的区别

如果使用jmeter做过参数化的人都知道&#xff0c;参数化的方式有多种&#xff0c;其中一种就是使用用户定义的变量&#xff0c;还有一种是使用用户参数。那么&#xff0c;这两个有什么异同呢&#xff1f; 一、先说相同的点&#xff1a; 1、都可以参数化&#xff0c;以供sample…

allure测试报告

使用pytest结合Allure进行测试报告生成的简单教程 allure测试报告 Allure基于Java开发&#xff0c;因此我们需要提前安装Java 8或以上版本的环境。 ◆安装allure-pytest插件在DOS窗口输入命令“pip3 install allure-pytest”&#xff0c;然后按“Enter”键。 下载安装Allure…

使用 Docker 部署 canal 服务实现MySQL和ES实时同步

文章目录 0. 环境介绍0. 前置步骤1. 安装Kibana和Elasticsearch2. 安装Canal和Canal Adapter2.1 修改数据库配置2.1.1 修改配置2.1.2 验证mysql binlog配置2.1.3 查看日志文件2.1.4 用JDBC代码插入数据库 2.2 安装Canal Server2.3 安装Canal Adapter修改两处配置文件配置文件取…

初识mysql数据库之引入mysql客户端库

目录 一、下载第三方库 1. 准备工作 1. 使用mysql官网提供的库 2. yum源安装 二、测试第三方库是否可用 三、mysql常用接口介绍 1. 查看官方文档 2. 初始化 3. 关闭mysql 4. 连接mysql 5. 下达sql指令 四、一个简单的C客户端库连接mysql程序 1. 头文件 2. 初始化…

Could not resolve host: mirrorlist.centos.org; Unknown error解决方法

今天服务器安装完CentOS系统后&#xff0c;安装网络的时候&#xff0c;出现无法联网yum yum -y install net-tools 以上代码无法运行并报错&#xff0c;这里我要提醒大家&#xff0c;如果在初始安装的时候选中安装网络工具模块就不用在安装net-tools了&#xff0c;因为我选中…

vite跨域配置踩坑,postman链接后端接口正常,但是前端就是不能正常访问

问题一&#xff1a;怎么都链接不了后端地址 根据以下配置&#xff0c;发现怎么都链接不了后端地址&#xff0c;proxy对了呀。 仔细看&#xff0c;才发现host有问题 // 本地运行配置&#xff0c;及反向代理配置server: {host: 0,0,0,0,port: 80,// cors: true, // 默认启用并允…

爆肝整理,性能测试方法与关键指标以及瓶颈定位思路,一篇贯通...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 性能测试方法 1、…