部分主要讲了以下内容:今天是第12天win32的课程 我先把动态链接库的使用和文件以及目录的使用相关Api函数给大家介绍下:(前期的笔记过两天补上-另附源码)
今天主要的内容有:
动态链接库的使用
列表框的使用
文件、目录操作使用
显示链接
1.定义函数指针类型 typedef
2.加载动态库
HMODULE LoadLibrary(
LPCTSTR lpFileName
);返回DLL的实例句柄 (HINSTANCE)
3.获取函数地址
FARPROC GetProcAddress( //
HMODULE hModule,//Dll句柄
LPCSTR lpProcName //函数名称
);成功返回函数地址
4.使用函数
5.卸载动态库
bool FreeLibrary(
HMODULE hModule //DLL的实例句柄
);
制作动态库
声明导出 - lib
模块文件导出 - dll/lib
.def文件
LIBARY 库名
EXPORTS
函数名 @1
函数名 @2
使用动态库
隐式链接 - 连接器从lib文件中获取函数的偏移地址
显式连接 - 程序执行起来后通过GetProcAddress函数动态的
从Dll文件查询到。
动态库封装类
在类名称前增加 _declspec(dllexport)定义,例如:
class _declspec(dllexport)CMath{
....
};
通常使用预编译开关切换类的导入导出定义,例如:
#ifdef DLLCLASS_EXPORTS
#define EXT_CLASS _declspec(dllexport) //DLL
#else
#define EXT_CLASS _declpec(dllimport)//使用者
#endif
class EXT_CLASS CMath{
....
};
动态库的程序入口
入口程序不是DLL必须的,常用于DLL内部初始化或善后处理。
BOOL WINAPI DllMain(
HINSTANCE hinstDLL, //动态库实例句柄
DWORD fdwReason, //被调用的原因
LPVOID lpvReserved //保留值
); 返回TRUE,表示动态库加载成功。
动态库的加载或卸载时会被调用。例如:使用LoadLibrary或
FreeLibrary时会被调用。
fdwReason 参数:
DLL_PROCESS_ATTACH 进程加载动态库
DLL_PROCESS_DETACH 进程卸载动态库
DLL_THREAD_ATTACH 线程加载动态库
DLL_THREAD_DETACH 线程卸载动态库
列表框的使用:
列表框的分类
单列列表框 - 默认
多列列表框 - LBS_MULTICOLUMN
列表框的使用
1.创建 "LISTBOX" 窗口类名称
2.添加选项
LB_ADDSTRING 使用 SendMessageBox 发
LB_INSERTSTRING 指定位置
3.删除选项
LB_DELETESTRING - 删除指定项
LB_RESETCONTENT - 清空所有项
4.获取和设置选择项
LB_GETCURSEL
LB_SETCURSEL
5.匹配查找
LB_FINDSTRING
LB_FINDSTRINGGEXACT
LB_SELECTSTRING
6.获取选项文本
LB_GETTEXTLEN 长度
LB_GETTEXT 内容
7.目录
LB_DIR
8.附加数据
LB_SETTIEMDATA
LB_GETTIEMDATA
通知消息
LBN_SELCHANGE - 当选项发生变化时,依附于
WM_COMMAND 消息发送到父窗口的窗口处理函数中。
文件目录操作相关:
Windows 文件系统
FAT、FAT32、NTFS
硬盘的管理
磁盘、扇、扇区 - 大小为512字节
文件系统最小管理单位
簇 - 由连续的几个扇区组成8/16/32/64
FAT32 - 1簇16扇区 32
NTFS - 1簇8扇区4k
Windows 目录
1.Windows 相关的目录
获取当前工作目录
DWORD GetCurrentDirectory(
DWORD nBufferLength, // 缓冲区大小
LPTSTR lpBuffer // 缓冲区
);
更改程序工作目录
BOOL SetCurrentDirectory(
LPCTSTR lpPathName // 目录
);
Windows 目录
UINT GetWindowsDirectory(
LPTSTR lpBuffer, // 缓冲区
UINT uSize // 缓冲区大小
);
Windows的System目录
UINT GetSystemDirectory(
LPTSTR lpBuffer, // buffer for system directory
UINT uSize // size of directory buffer
);
临时文件目录
DWORD GetTempPath(
DWORD nBufferLength, // size of buffer
LPTSTR lpBuffer // path buffer
);
目录创建
BOOL CreateDirectory(
LPCTSTR lpPathName, // 目录名称
LPSECURITY_ATTRIBUTES lpSecurityAttributes // NULL
);
移动目录(不能跨盘) 可以更改目录名称
BOOL MoveFile(
LPCTSTR lpExistingFileName, // 当前名字
LPCTSTR lpNewFileName // new file name
);
删除目录(自能删除空目录)
BOOL RemoveDirectory(
LPCTSTR lpPathName // directory name
);
Windows文件
1.创建Windows文件
HANDLE CreateFile(
LPCTSTR lpFileName, // file name
DWORD dwDesiredAccess, // 访问权限
DWORD dwShareMode, // 共享方式
LPSECURITY_ATTRIBUTES lpSecurityAttributes, // 安全属性 NULL
DWORD dwCreationDisposition, // 创建方式或打开
DWORD dwFlagsAndAttributes, // 文件属性
HANDLE hTemplateFile // 文件句柄模版 默认NULL
);
成功返回文件句柄
2.写数据
BOOL WriteFile(
HANDLE hFile, // 文件句柄
LPCVOID lpBuffer, // 数据BUFF
DWORD nNumberOfBytesToWrite, // 准备写入的数据长度
LPDWORD lpNumberOfBytesWritten, // 返回实际写入的数据
LPOVERLAPPED lpOverlapped // 默认为NULL
);
3.读数据
BOOL ReadFile(
HANDLE hFile, // handle to file
LPVOID lpBuffer, // data buffer
DWORD nNumberOfBytesToRead, // number of bytes to read
LPDWORD lpNumberOfBytesRead, // number of bytes read
LPOVERLAPPED lpOverlapped // 默认为NULL
);
4.关闭文件
bool CloseHandle(
HANDLE hObject //文件句柄
)
5.文件长度
DWORD GetFileSize(
HANDLE hFile, //文件句柄
LPDWORD lpFileSizeHigh //返回文件长度的高32位
);返回值是文件长度低32位
6.文件指针
DWORD SetFilePointer(
HANDLE hFile, // 文件句柄
LONG lDistanceToMove, // 偏移量的低32位
PLONG lpDistanceToMoveHigh, // 偏移量的高32位
DWORD dwMoveMethod // 偏移的相对位置
);
7.文件相关操作
CopyFile - 拷贝文件
BOOL CopyFile(
LPCTSTR lpExistingFileName, // 源文件名
LPCTSTR lpNewFileName, // 目的地名
BOOL bFailIfExists // 是否覆盖
); // TRUE - 不覆盖 FALSE - 覆盖
DeleteFile - 删除文件
MoveFile - 移动文件(随便跨盘)
8.文件属性
GetFileAttributes - 获取文件属性
SetFileAttributes - 设置文件属性
GetFileAttributesEx - 获取文件属性、时间
文件遍历
1.查找文件
HANDLE FindFirstFile(
LPCTSTR lpFileName, // 查找路径
LPWIN32_FIND_DATA lpFindFileData // 查找的数据WIN32_FIND_DATA是结构体
);返回查找句柄
2.获取下一个文件
BOOL FindNextFile(
HANDLE hFindFile, // 查找句柄
LPWIN32_FIND_DATA lpFindFileData // 查找的数据
);找到返回TRUE
3.关闭查找
BOOL FindClose(
HANDLE hFindFile // 查找句柄
);