win32Api 消息 IO
来源:互联网 发布:数据库查询软件密码 编辑:程序博客网 时间:2024/05/18 02:36
创建一个窗体得过程
//1 注册
//2 创建
//3 处理消息
用户一般也是把消息取出来(GetMessage),调用WindowProc处理.(只能
使用CallWindowProc调用,但一般调用他的封装函数DispatchMessage)
DispatchMessage首先解析lpmsg的窗口过程,然后在调用CallWindowProc。
int MessageBox(
HWND hWnd, //提示窗体的父窗体
LPCTSTR lpText, //提示的文本
LPCTSTR lpCaption, //标题
UINT uType //按钮样式
);
int WINAPI WinMain(
HINSTANCE hInstance, //程序的初始化地址
HINSTANCE hPrevInstance, //永远不用
LPSTR lpCmdLine, //命令行
int nCmdShow //窗体显示的样式
);
1.先定义后注册。
typedef struct _WNDCLASS {
UINT style; //窗体的样式(*) CS_VREDRAW | CS_HREDRAW
WNDPROC lpfnWndProc; //处理窗体的交互事件(*)
int cbClsExtra; //注册类的系统分配空间 0
int cbWndExtra; //系统为窗口数据分配的空间 0
HINSTANCE hInstance; //程序的内存地址(WinMain传递)
HICON hIcon; //窗口图标 (0/NULL)
HCURSOR hCursor; //鼠标光标(0/NULL)
HBRUSH hbrBackground; //背景颜色(*)
LPCTSTR lpszMenuName; //菜单 (0/NULL)
LPCTSTR lpszClassName; //注册名(*)
} WNDCLASS, *PWNDCLASS;
ATOM RegisterClass(
CONST WNDCLASS *lpWndClass // 注册窗口类的数据参数
);
2.创建
HWND CreateWindow(
LPCTSTR lpClassName, // 使用RegisterClass注册的名字
LPCTSTR lpWindowName, // 窗体的标题文本
DWORD dwStyle, // 窗体样式
int x, // 窗体的x-坐标
int y, // 窗体的y-坐标
int nWidth, // 窗体宽度
int nHeight, // 窗体的高度
HWND hWndParent, // 窗体的父窗体
HMENU hMenu, // 窗体菜单
HINSTANCE hInstance, // 应用程序的句柄
LPVOID lpParam // 创建窗体的数据(对MDI窗体有意义)0
);
3.消息处理
先获取,在发送
BOOL GetMessage(
LPMSG lpMsg, // 返回消息
HWND hWnd, // 指定消息所属的窗体,如果是NULL,则取所有消息
UINT wMsgFilterMin, // 消息最小值 0
UINT wMsgFilterMax // 消息最大值 0
);
LRESULT DispatchMessage(
CONST MSG *lpmsg // message information
);
DispatchMessage首先解析lpmsg的窗口过程,然后在调用CallWindowProc
******************
控制台输出的应用
*****************************************************************************************************
1.创建控制台
BOOL AllocConsole(void);创建控制台
BOOL FreeConsole(VOID);用完释放控制台
2.获取需要的IO句柄
HANDLE GetStdHandle(
DWORD nStdHandle // input, output, or error device
);
返回:控制台IO句柄
参数:指定控制台IO的类型:标准输入/标准输出/标准错误输出
STD_INPUT_HANDLE Standard input handle
STD_OUTPUT_HANDLE Standard output handle
STD_ERROR_HANDLE Standard error handle
3.控制台输出
BOOL WriteConsole(
HANDLE hConsoleOutput, // 控制台句柄
CONST VOID *lpBuffer, // 输出数据的缓冲
DWORD nNumberOfCharsToWrite, // 输出数据大小
LPDWORD lpNumberOfCharsWritten, // 返回实际输出的数据个数
LPVOID lpReserved // 永远不使用
);
***********
消息处理
****************************************************************************************************
一、WM_PAINT的工作原理:
BeginPaint InvalidateRect ValidateRect
EndPaint InvalidateRgn ValidateRgn
1.WM_PAINT没有参数,但是依赖一个绘制区数据结构.PAINTSTRUCT
他们之间的关系:WM_PAINT触发,必须存在PAINTSTRUCT结构
如果存在PAINTSTRUCT结构,则系统回自动发送WM_PAINT消息
2.BeginPaint/EndPaint与WM_PAINT的关系
BeginPaint/EndPaint获取WM_PAINT对应的绘制结构PAINTSTRUCT
返回HDC.
如果WM_PAINT对应的PAINTSTRUCT是空,则BeginPaint返回0
3.强制调用WM_PAINT的消息处理:
PostMessage发送消息
UpdateWindow完成
RedrawWindow完成
前面两个函数可以强制发送消息,但是没有绘制结构PAINTSTRUCT
推荐:InvalidateRect/InvalidateRgn产生一个绘制区.
4.动画编程模型:
1.在定时器过程改变数据y+=3,并且设置绘制的无效区InvalidateRect,
同时强制更新窗体UpdateWindow
2.在WM_PAINT主要根据数据进行绘制工作
=================================================================================================
1.WM_PAINT://当窗体大小/位置改变的时候,该消息被系统使用PostMessage发送
a.WM_PAINT不能使用SendMessage发送
b.WM_PAINT优先级别比较低的消息
c.WM_PAINT的参数(没有使用)
d.WM_PAINT的返回值:0:表示已经处理
2.利用WM_PAINT绘制图形与文本
在WIN32设备指针 HDC.所有绘制函数都需要一个HDC参数.
每个窗都有一个HDC.可以通过CS_OWNDC来指定. 否则所有公用DC.
2.1.得到窗口的HDC
HDC BeginPaint(
HWND hwnd, // 绘制所在窗口句柄
LPPAINTSTRUCT lpPaint // 结构体指针(地址)
);
返回:HDC/有效绘制区域LPPAINTSTRUCT lpPaint
该函数必要与EndPaint匹配使用
2.2.TextOut文本绘制
BOOL TextOut(
HDC hdc, // 绘制设备(隶属于某个窗口)
int nXStart, // 绘制的位置
int nYStart, // 绘制的位置
LPCTSTR lpString, // 绘制的字符串
int cbString // 绘制的字符串长度
);
3.3释放HDC及绘制区域结构体
ReleaseDC(hwnd,hDc);
EndPaint(hwnd,&ps);
@文本绘制
***************************************************************************************************
1.背景颜色
COLORREF SetBkColor(
HDC hdc, // handle to DC
COLORREF crColor // background color value
);
其返回值为原来背景颜色
并可设置背景模式:默认为透明
int SetBkMode(
HDC hdc, // handle to DC
int iBkMode // background mode
);
设置背景模式:透明TRANSPARENT 不透明OPAQUE
2.创建字体
HFONT CreateFont(
int nHeight, // 字体高度
int nWidth, // 字体的宽度(平均)
int nEscapement, // 角度(1/10度)
int nOrientation, // 角度(1/10度)
int fnWeight, // 字体的粗细(系统规定)
DWORD fdwItalic, // 斜体
DWORD fdwUnderline, // 下划线
DWORD fdwStrikeOut, // 中划线
DWORD fdwCharSet, // 字符集(系统固定)
DWORD fdwOutputPrecision, // 输出精度
DWORD fdwClipPrecision, // 裁减精度
DWORD fdwQuality, // 输出质量
DWORD fdwPitchAndFamily, // pitch and family
LPCTSTR lpszFace // "字体名"
);
创建完成,选择为设备,设置字体:SelectObject
HGDIOBJ SelectObject(
HDC hdc, // handle to DC
HGDIOBJ hgdiobj // handle to object
);
HGDIOBJ:HFONT HBRUSH HPEN HBITMAP
3.文本颜色
COLORREF SetTextColor(
HDC hdc, // handle to DC
COLORREF crColor // text color
);
4.坐标系以及坐标的单位度量
默认坐标轴:单位象素,下,右(设备坐标)
坐标轴修改使用SetMapMode.(逻辑坐标/设备坐标)
绘制中使用逻辑坐标系,设置坐标模式
int SetMapMode(
HDC hdc, // handle to device context
int fnMapMode // new mapping mode
);
下面两个是用户自定义坐标(坐标系方向/单位)
MM_ANISOTROPIC MM_ISOTROPIC
下面六种情况不能修改坐标系,不能修改单位
MM_HIENGLISH 0.001 inch 上 右
MM_HIMETRIC 0.01 mm 上 右
MM_LOENGLISH 0.01 inch 上 右
MM_LOMETRIC 0.1 mm 上 右
MM_TWIPS 1/1440 inch 上 右
MM_TEXT 与设备坐标系一直 下 右
5.文本的对齐方式
SetTextAlign
6.位置(在 TextOut函数参数指定)
下面六个函数受文本对齐影响
a.TextOut
b.ExtTextOut
BOOL ExtTextOut(
HDC hdc, // 绘制DC
int X, // 绘制的开始位置-x
int Y, // 绘制的开始位置-y
UINT fuOptions, // 控制文本输出的方式:ETO_OPAQUE ETO_CLIPPED
CONST RECT* lprc, // 绘制的区域
LPCTSTR lpString, // 绘制的字符串
UINT cbCount, // 绘制的字符串的长度
CONST INT* lpDx // 输出的字符之间的间距
);
c.DrawText (比较上面的函数,多一个主要功能:支持tab键,并且可以控制tab的宽度)
int DrawText(
HDC hDC, // handle to DC
LPCTSTR lpString, // 绘制的字符串
int nCount, // 绘制的长度
LPRECT lpRect, // 绘制区域
UINT uFormat // 绘制选项
);
UINT uFormat // 绘制选项
控制位置:
DT_CENTER
DT_LEFT
DT_RIGHT
只有加上DT_SINGLELINE选项有效
DT_VCENTER
DT_TOP
DT_BOTTOM
控制/n与/t
DT_SINGLELINE不支持/n
默认不支持/t但支持/n.
d.DrawTextEx
int DrawTextEx(
HDC hdc, // handle to DC
LPTSTR lpchText, // 绘制字符串
int cchText, // 绘制长度
LPRECT lprc, // 绘制区域
UINT dwDTFormat, // 格式选项
LPDRAWTEXTPARAMS lpDTParams // 扩展格式
);
typedef struct {
UINT cbSize; //结构体大小
int iTabLength; //tab键的长度
//(不能小于默认的tab的字符个数)
//受DT_TABSTOP影响
int iLeftMargin; 左边界
int iRightMargin; 有边界
UINT uiLengthDrawn; //返回实际的长度
} DRAWTEXTPARAMS, *LPDRAWTEXTPARAMS;
e.PolyTextOut
可以输出多个不同位置的字符串
在TextOut基础上可以输出多个字符串
f.TabbedTextout
在TextOut基础上增强/t的输出
@图型绘制
****************************************************************************************************
1.点的绘制SetPixel
COLORREF SetPixel(
HDC hdc, // handle to DC
int X, // x-coordinate of pixel
int Y, // y-coordinate of pixel
COLORREF crColor // pixel color
);
2.线的绘制(受Pen影响)
定位MoveToEx 如果不定位,默认的位置是(0,0) 或者当前位置
BOOL MoveToEx(
HDC hdc, // handle to device context
int X, // x-coordinate of new current position
int Y, // y-coordinate of new current position
LPPOINT lpPoint // 返回原来的当前点,不返回则设置为NULL/0
);
a.直线LineTo
BOOL LineTo(
HDC hdc, // device context handle
int nXEnd, // x-coordinate of ending point
int nYEnd // y-coordinate of ending point
);
线段Polyline PolylineTo
b.弧线Arc ArcTo
BOOL Arc(
HDC hdc, // handle to device context
int nLeftRect, // 弧外切的矩形的左上角顶点-x
int nTopRect, // 弧外切的矩形的左上角顶点-y
int nRightRect, // 弧外切的矩形的右下角顶点-x
int nBottomRect, // 弧外切的矩形的右下角顶点-y
int nXStartArc, // x-coord of first radial ending point
int nYStartArc, // y-coord of first radial ending point
int nXEndArc, // x-coord of second radial ending point
int nYEndArc // y-coord of second radial ending point
);
角度的方向:逆时针,改变角度方向
int SetArcDirection(
HDC hdc, // handle to device context
int ArcDirection // new arc direction
);
AD_COUNTERCLOCKWISE 反时针
AD_CLOCKWISE 顺时针
c.曲线PolyBezier PolyBezierTo
BOOL PolyBezier(
HDC hdc, //
CONST POINT* lppt, // 贝塞儿曲线的控制点
DWORD cPoints // count of endpoints and control points
);
3.区域的填充绘制(受Brush影响)
HDC=BeginPaint
HDC=GetDC
HDC=GetWindowDC
Brush的创建与设置 CreateSolidBrush实心刷子 CreateHatchBrush形状刷子
HBRUSH CreateSolidBrush(
COLORREF crColor // brush color value
);
HGDIOBJ SelectObject(
HDC hdc, // handle to DC
HGDIOBJ hgdiobj // handle to object
);
=============================================
补充:
创建Pen :CreatePen
HPEN CreatePen(
int fnPenStyle, // 系统定义的样式
int nWidth, // 宽度
COLORREF crColor // 颜色
);
设置Pen :SelectObject
=============================================
a.矩形区域 Ellipse
BOOL Ellipse(
HDC hdc, // handle to DC
int nLeftRect, // x-coord of upper-left corner of rectangle
int nTopRect, // y-coord of upper-left corner of rectangle
int nRightRect, // x-coord of lower-right corner of rectangle
int nBottomRect // y-coord of lower-right corner of rectangle
);
背景颜色的影响 PEN的影响 BRUSH的影响
int FillRect(
HDC hDC, //
CONST RECT *lprc, // 绘制区域
HBRUSH hbr // 区域填充刷子
);
HDC的刷子对FillRect没有影响,而对参数指定的刷子有影响.
FrameRect
InvertRect
RoundRect
b.弧 Chrod Pie
BOOL Chord(
HDC hdc, // handle to DC
int nLeftRect, // x-coord of upper-left corner of rectangle
int nTopRect, // y-coord of upper-left corner of rectangle
int nRightRect, // x-coord of lower-right corner of rectangle
int nBottomRect, // y-coord of lower-right corner of rectangle
int nXRadial1, // x-coord of first radial's endpoint
int nYRadial1, // y-coord of first radial's endpoint
int nXRadial2, // x-coord of second radial's endpoint
int nYRadial2 // y-coord of second radial's endpoint
);
BOOL Pie(
HDC hdc, // handle to DC
int nLeftRect, // x-coord of upper-left corner of rectangle
int nTopRect, // y-coord of upper-left corner of rectangle
int nRightRect, // x-coord of lower-right corner of rectangle
int nBottomRect, // y-coord of lower-right corner of rectangle
int nXRadial1, // x-coord of first radial's endpoint
int nYRadial1, // y-coord of first radial's endpoint
int nXRadial2, // x-coord of second radial's endpoint
int nYRadial2 // y-coord of second radial's endpoint
);
c.多边形区域 Polygon(一个多边形) PolyPolygon(多个多边形)
BOOL Polygon(
HDC hdc, // handle to DC
CONST POINT *lpPoints, // polygon vertices
int nCount // count of polygon vertices
);
BOOL PolyPolygon(
HDC hdc, // handle to DC
CONST POINT *lpPoints, // 顶点
CONST INT *lpPolyCounts, // 顶点分组以及每组个数
int nCount // 多边形的个数
);
4.用户自定义坐标轴
坐标轴原点SetWindowOrgEx 设置设备坐标的原点在窗口的位置
SetViewportOrgEx 设置逻辑坐标的原点在设备坐标中的位置
坐标轴单位SetWindowExtEx SetViewportExtEx
坐标轴方向SetWindowExtEx SetViewportExtEx (通过正负决定方向)
修改坐标轴的函数 SetMapMode SetWindowExtEx SetWindowOrgEx
SetViewportExtEx SetViewportOrgEx
BOOL SetWindowOrgEx(
HDC hdc, //
int X, // 新的原点
int Y, // 新的原点
LPPOINT lpPoint // 返回就的原点
);
BOOL SetViewportExtEx(
HDC hdc, // handle to device context
int nXExtent, // x坐标单位
int nYExtent, // y坐标单位
LPSIZE lpSize // original viewport extent
);
*********************************************************************************************
二、WM_TIMER定时器
1.创建一个定时器(一般在创建消息WM_CREATE里创建)
2.处理定时器发生的过程 SetTimer
UINT_PTR SetTimer(
HWND hWnd, // handle to window
UINT_PTR nIDEvent, // timer identifier
UINT uElapse, // time-out value
TIMERPROC lpTimerFunc // timer procedure
);
删除定时器KillTimer
*********************************************************************************************
三、鼠标消息
1.类型:
WM_CAPTURECHANGED
M_MOUSEACTIVATE
2.返回值及参数:
鼠标消息的返回值:0表示已经处理消息
鼠标消息的参数:WPARAM:鼠标消息触发的时候按键状态:SHIFT/CONTROL
LPARAM:存放的鼠标的x,y坐标.高的2个字节存放的是y坐标,低的2个字节存放的是x坐标
WM_NCLBUTTONDBLCLK消息缺省处理的时候,发送WM_CLOSE的消息
所有的鼠标消息都是由WM_NCHITEST发出的.
===============================================================
#pragma 指令
C标准定义预处理指令,考虑编译器厂商的扩展.扩展由#pragma实现.
===============================================================
判定系统的鼠标支持:
int GetSystemMetrics(
int nIndex // system metric or configuration setting
);
SM_CMOUSEBUTTONS//返回鼠标的支持的按键的个数
SM_CXSCREEN,//获得屏幕的大小width
SM_CYSCREEN//获得屏幕的大小height
SM_MOUSEPRESENT //系统是否安装鼠标
SM_MOUSEWHEELPRESENT//鼠标是否支持滚轮
****************************************************************************************************
四、键盘消息
WM_KEYDOWN WM_SYSCHAR WM_ACTIVATE
WM_KEYUP WM_SYSKEYDOWN WM_KILLFOCUS
WM_CHAR WM_SYSKEYU WM_SETFOCUS
===============================================
实验1:体会WM_ACTIVATE
WM_KILLFOCUS
WM_SETFOCUS消息触发的条件
Activate(Click)->Focus->Inactivate->KillFocus
实验2:体会
WM_SYSCHAR
WM_SYSKEYDOWN alt/alt+key
WM_SYSKEYUP消息触发条件
实验3:
理解WM_KEYDOWN/WM_KEYUP/WM_CHAR 消息的数据
================================================
虚拟键:大部分的键的ASCII与Virtual Key一一对应.
windows.h为各个虚拟键定义了各自的宏VK_*.
wParam short --WM_KEYDOWN的键值
lParam int --存放的按键的状态
可以通过wParam得到键盘的按键.
WM_KEYDOWN/WM_CHAR中键值的区别.
1.VK_***把所有虚拟键值定义宏 viturl key
2.CTRL+shift键的处理
GetKeyState() <0 按下、 >=0 释放
********************
使用资源创建对话框.
*****************************************************************************************************
1.创建对话框资源
a.CLASS设置与ID名一致
b.STYLE设置:对话框样式/窗体样式(CreateWindow)
按钮的扩展样式
决定按钮类型的扩展样式,只能选一
BS_PUSHBUTTON (空格) BS_DEFPUSHBUTTON(回车都会触发消息)
BS_CHECKBOX(程序员处理选择) BS_AUTOCHECKBOX(自动选择)
BS_RADIOBUTTON(程序员处理选择) BS_AUTORADIOBUTTON(自动选择)
BS_3STATE(三维样式) BS_AUTO3STATE
BS_GROUPBOX分组控件(主要对收音机按钮设计)
下面样式可以随意选择
BS_LEFTTEXT (主要对单选与多选按钮) BS_RIGHTBUTTON
BS_FLAT BS_TOP BS_LEFT BS_RIGHT BS_CENETER BS_VCEENTER
BS_BITMAP BS_BOTTOM BS_TEXT BS_ICON
BS_MULTILINE 默认不支持/n字符,该样式支持/n字符
2.写代码使用资源注册窗体
3.创建窗体
HWND CreateDialog(
HINSTANCE hInstance, // 实例句柄
LPCTSTR lpTemplate, // 注册类名
HWND hWndParent, // 父窗体句柄
DLGPROC lpDialogFunc // 消息处理过程
);
资源创建的控件 没有HWND,有ID
运行时创建的控件 没有ID,有HWND
****************
对话框与菜单资源
****************************************************************************************************
对话框的创建的方法:
1.运行时创建(函数)
2.设计时创建(资源)
对话框的创建:CreateWindow不适合创建对话框.
CreateDialog (非模式对话框 主窗体)
DialogBox(模式对话框)
MessageBox(特殊用途的模式对话框)
对话框类型: 模式对话框 非模式对话框
编程模式:
1.CreateDialog+资源=创建主窗体
1.1.制作对话框资源
1.2.使用RegisterClass注册主窗体类
1.3.使用CreateDialog产生主窗体
CreateDialog+资源=创建非模式对话框
1.1.制作对话框资源
1.2.直接使用CreateDialog产生非模式对话框
2.DialogBox+资源=模式对话框
2.1.制作对话框资源
2.2.使用DialogBox创建模式对话框
窗体消息处理与对话框消息处理的区别:
1.主窗体必须注册,消息处理函数在注册的时候指定。
2.对话框处理函数与窗体的消息处理函数不同的。
case WM_CREATE:
INT_PTR CALLBACK DialogProc(
HWND hwndDlg, // handle to dialog box
UINT uMsg, // message
WPARAM wParam, // first message parameter
LPARAM lParam // second message parameter
);
return DefWindowProc;
case WM_INITDIALOG:
LRESULT CALLBACK MainWinProc(
HWND hwnd,
UINT uMsg,
WPARAM wParam,
LPARAM lParam
);
return DefDlgProc;
3.窗体的缺省处理与对话框的缺省处理不一样的。
比如:
WM_CLOSE:关闭窗体/ 发送WM_DESTROY消息
在对话框中,不进行任何处理:用户自己决定destroy还是隐藏
建议对话框的处理尽量用户自己处理。
而不是调用DefDlgProc处理 .
4.对话框不需要注册。
5.对话框创建的消息是WM_INITDIALOG不是WM_CREATE
6.CreateDialog的时候,这个函数马上返回。而且返回对话框的HWND
7.CreateDialog与DialogBox的函数区别
INT_PTR DialogBox(
HINSTANCE hInstance, // handle to module
LPCTSTR lpTemplate, // dialog box template
HWND hWndParent, // handle to owner window
DLGPROC lpDialogFunc // dialog box procedure
);
这个函数创建对话框以后不马上返回,而是在对话框消息处理函数
中调用EndDialog才返回。
BOOL EndDialog(
HWND hDlg, // handle to dialog box
INT_PTR nResult // 与DialogBox的返回值一样
);
HWND CreateDialog(
HINSTANCE hInstance, // handle to module
LPCTSTR lpTemplate, // dialog box template name
HWND hWndParent, // handle to owner window
DLGPROC lpDialogFunc // dialog box procedure
);
对话框的操作:
GetDlgItemText SetDlgItemText GetDlgItem GetDlgItemInt
SendDlgItemMessage SetDlgItemInt
**********************************
Win32的IO操作(文件与目录管理, IO)
****************************************************************************************************
编程模型:
写文件 读文件 CreateFile
创建/打开文件
写文件 读文件
关闭文件
HANDLE CreateFile(
LPCTSTR lpFileName, // 文件名
DWORD dwDesiredAccess, // 访问模式
DWORD dwShareMode, // 共享
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 安全属性,建议采用默认属性 0
DWORD dwCreationDisposition, // 创建与打开方式
DWORD dwFlagsAndAttributes, // 属性
HANDLE hTemplateFile // 临时备份,建议为NULL/0
);
======================================================
访问模式
0 非读写,只能获取文件属性
GENERIC_READ GENERIC_WRITE
共享模式
FILE_SHARE_READ FILE_SHARE_WRITE(建议不要使用)
创建与打开方式
CREATE_NEW CREATE_ALWAYS
OPEN_EXISTING OPEN_ALWAYS
TRUNCATE_EXISTING(建议不要使用)
文件属性
FILE_ATTRIBUTE_NORMAL(建议使用)
======================================================
BOOL WriteFile(
HANDLE hFile, // 写的文件
LPCVOID lpBuffer, // 写的数据
DWORD nNumberOfBytesToWrite, // 写的数据大小
LPDWORD lpNumberOfBytesWritten, // 返回实际写的数据大小(必须返回)
LPOVERLAPPED lpOverlapped // 建议为0,只有当CreateFile时候指定FILE_FLAG_OVERLAPPED
);
BOOL ReadFile(
HANDLE hFile, // 文件句柄
LPVOID lpBuffer, // 读取缓冲
DWORD nNumberOfBytesToRead, // 缓冲大小
LPDWORD lpNumberOfBytesRead, // 实际读取的大小
LPOVERLAPPED lpOverlapped // 0
);、
******************************
WIN32虚拟内存与文件映射
****************************************************************************************************
Win32采用虚拟地址
虚拟地址只有映射到物理存储才能访问,否则段错误.
可以映射哪些物理存储:内存/磁盘文件/匿名映射
编程步骤:
1.打开文件CreateFile
2.创建内核映射对象CreateFileMapping
3.把映射对象转换为虚拟地址 MapViewOfFile
4.卸载虚拟地址与文件映射UnmapViewOfFile
5.删除释放内核映射对象CloseHandle
6.关闭文件CloseHandle
LPVOID VirtualAlloc(
LPVOID lpAddress, // 申请内存的开始位置,如果为NULL,则由系统随机指定
SIZE_T dwSize, // 申请的内存空间大小
DWORD flAllocationType, // 申请内存的方式MEM_COMMIT等
DWORD flProtect // 内存的保护模式PAGE_READONLY
);
HANDLE CreateFileMapping(
HANDLE hFile, // 文件句柄
LPSECURITY_ATTRIBUTES lpAttributes, // 默认为NULL
DWORD flProtect, // 保护模式
DWORD dwMaximumSizeHigh, // 文件映射的大小(对32系统永远是0)
DWORD dwMaximumSizeLow, // 文件映射的大小(32) 0:映射全部文件
LPCTSTR lpName // 文件映射的内核内部名
);
可以根据名字查找内核对象:OpenFileMapping
LPVOID MapViewOfFile(
HANDLE hFileMappingObject, // 内核映射对象
DWORD dwDesiredAccess, // 访问模式
DWORD dwFileOffsetHigh, // 永远是0
DWORD dwFileOffsetLow,
怎么判定读取到文件尾巴
1.ReadFile返回False
2.使用GetLastError返回错误码:ERROR_HANDLE_EOF读取文件尾巴
- win32Api 消息 IO
- win32API+C分析Windows消息运行原理
- Win32API
- Win32API大全
- Win32API详解
- 常用WIN32API
- Win32API大全
- Win32API大全
- win32API OpenProcess()
- Win32API大全
- Quicksort (win32API )
- python win32api
- C#引入Win32API:常用Win32API
- WinSock IO模型二: WSAAsyncSelect 消息机制
- socket.io中emit消息形式
- socket.io + nodes 实现webSocket消息提醒
- 利用 socket.io 实现消息实时推送
- 常用Win32API 封装 Win32api for .net
- 网站流量统计
- HTML学习笔记【3】使用图像
- HTML学习笔记【4】使用列表
- HTML学习笔记【5】使用表格
- ranknow.cn网站数据评估 分析 SEO报告
- win32Api 消息 IO
- Android developer
- 详细讲解PHP的日期时间函数
- 《Visual C# 最佳实践》第三章 数组结构 (一):数组
- Effective C++ 笔记
- 最新找到XP如何加大adsl带宽的方法!值得一试!! 05年的 不知道还有没有用 大家测试下吧
- js跨域
- 《C++ Primer》心得(一)
- ESBasic 可复用的.NET类库(25) -- 增量自动获取器 IIncreaseAutoRetriever