编写winapi程序,要引入 windows.h 头文件
对于控制台程序来说,入口函数为 int main() , 对应的用于接受命令行的入口函数为 int main( int argc , LPTSTR argv[] ) , 其中的 LPTSTR 可视为 字符指针
windows的数据宏名命名有一定的规则 如 LPTSTR 中 LP为 long pointer长指针 ,T 为通用之意(ansi和unicode字符处理),STR即string
一般以LP和P开头的都为指针类型
对一个文件进行操作,首先要获得文件句柄,我理解这个句柄就是对文件的引用,句柄的类型为HANDLE
首先使用CreateFile函数创造句柄,函数原型如下
HANDLE CreateFile (
LPCTSTR lpName,
DWORD dwAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes,
DWORD dwCreate,
DWORD dwAttrsAndFlags,
HANDLE hTempateFile )
其中lpName为文件所在路径,LPCTRSTR与上面的类似,多出来的C表示常量const,所以此参数可以视为字符串,注意文件路径中的斜杠要转义
dwAccess为指定访问方式,可以输入GENERIC_READ或者GENERIC_WRITE,或GENERIC_READ | GENERIC_WRITE表示同时具有读写访问
dwShareMode为文件共享方式,输入0为不能共享,即只能打开这一个HANDLE。其他可选的参数有FILE_SHARE_READ和FILE_SHARE_WRITE
lpSecurityAttribute指定安全性,可以使用NULL表示默认安全性
dwCreate的参数如下:
CREATE_NEW 创建新文件,如果指定文件已经存在则创建失败
CREATE_ALWAYS 创建新文件,如果存在则覆盖
OPEN_EXISTING 打开现有文件,如果文件不存在则失败
OPEN_ALWAYS 打开现有文件,如果不存在则创建
TRUNCATE_EXISTING 需指定GENERIC_WRITE,文件存在则内容被销毁,文件不存在则失败
dwAttrsAndFlags 指定文件属性和标志,一般为FILE_ATTRIBUTE_NORMAL
hTemplateFile 指定创建文件时的模板,通常为NULL
创建句柄后通过比较该句柄是否为 INVALID_HANDLE_VALUE 来判断是否创建成功
对文件的一些操作函数如下:
读文件 ReadFile
BOOL ReadFile (
HANDLE hFile ,
LPVOID lpBuffer ,
DWORD nNumberOfBytesToRead ,
LPDWORD lpNumberOfBytesRead ,
LPOVERLAPPED lpOverlapped )
第一项是CreateFile创建的句柄
第二项为读字符存放的缓冲区,可自己定义一个字符数组传入,字符数组使用前用ZeroMemory函数将此区域清零
第三项为要读入字节的数量,为输入参数,第四项为实际读入字节的数量,为输出参数,可以比较这两个值是否相等判断操作是否失败
第五项目前传入NULL
写文件 WriteFile
BOOL WriteFile (
HANDLE hFile ,
LPVOID lpBuffer ,
DWORD nNumberOfBytesToWrite ,
LPDWORD lpNumberOfBytesWrite ,
LPOVERLAPPED lpOverlapped )
与上一个函数类似,其中lpBuffer是要写入的字符
句柄创建使用后应该关闭,使用 BOOL CloseHandle ( HANDLE object ),关闭一个无效句柄或者关闭两个句柄将抛出异常,无须关闭也不应关闭标准设备句柄
示例程序:复制文件 命令行需要带两个参数,第一个参数为源文件路径,第二个参数为目的文件路径
#include <stdio.h>
#include <windows.h>
#define BUF_SIZE 256
int main(int argc , LPTSTR argv[])
{
HANDLE hIn , hOut;
DWORD nIn , nOut ;
CHAR buffer[BUF_SIZE];
if(argc != 3){
printf("wrong usage");
return 1;
}
hIn = CreateFile(argv[1] , GENERIC_READ , FILE_SHARE_READ , NULL
, OPEN_EXISTING , FILE_ATTRIBUTE_NORMAL , NULL);
if(hIn == INVALID_HANDLE_VALUE){
printf("error:%x\n",GetLastError());
return 3 ;
}
hOut = CreateFile(argv[2] , GENERIC_WRITE , 0 , NULL , CREATE_ALWAYS
, FILE_ATTRIBUTE_NORMAL , NULL);
if(hOut == INVALID_HANDLE_VALUE){
printf("error:%x\n",GetLastError());
return 3 ;
}
while (ReadFile(hIn, buffer ,BUF_SIZE ,&nIn , NULL)&&nIn>0){
WriteFile(hOut , buffer , nIn ,&nOut , NULL);
if (nIn != nOut){
printf("error : %x", GetLastError());
return 4;
}
}
CloseHandle(hIn);
CloseHandle(hOut);
return 0;
}