设为首页 加入收藏

TOP

2.5.1 使用Windows API
2013-10-07 00:50:08 来源: 作者: 【 】 浏览:76
Tags:2.5.1 使用 Windows API

2.5  茴字的N种写法

在Visual C++(www.cppentry.com)世界里,对于每一种需求,几乎都存在着多种技术实现方式,这些细枝末节层层交错,从而形成了壮观的Visual C++(www.cppentry.com)技术脉络图。本节将实现一个目标,即将孔乙己的"茴"字输出至某个文件中,并再次读取出来。其中主要的技术点就是针对文件做一些操作,而Visual C++(www.cppentry.com)关于文件的操作方式就非常之多,有Windows API方式、C++(www.cppentry.com)标准库方式等,这些方式如图2-48所示。

以下详细介绍使用在Windows系统中以各种方式(优雅的或者鄙俗的)写出"茴"字。

 
(点击查看大图)图2-48  茴字的N种写法

2.5.1  使用Windows API

API的英文全称为Application Programming Interface,Win32 API也就是Microsoft Windows 32位平台的应用程序编程(www.cppentry.com)接口。想一想,如果没有Win32 API,我们该如何操作文件?自己去驱动磁盘驱动器?自己去编写硬件驱动程序?不可能。Windows API介于Windows操作系统与应用程序之间,因此它是离Windows操作系统最近的函数接口,它们之间的关系如图2-49所示。

 
图2-49  Windows API的位置
针对文件读写这一最基础的操作,很显然,Windows会责无旁贷地提供操作函数:
  1. HANDLE CreateFile(              //创建、打开一个文件  
  2.   LPCTSTR lpFileName,   
  3.   DWORD dwDesiredAccess,   
  4.   DWORD dwShareMode,   
  5.   LPSECURITY_ATTRIBUTES lpSecurityAttributes,   
  6.   DWORD dwCreationDisposition,   
  7.   DWORD dwFlagsAndAttributes,   
  8.   HANDLE hTemplateFile  
  9. );  
  10.  
  11. BOOL WriteFile(             //写文件  
  12.   HANDLE hFile,   
  13.   LPCVOID lpBuffer,   
  14.   DWORD nNumberOfBytesToWrite,   
  15.   LPDWORD lpNumberOfBytesWritten,   
  16.   LPOVERLAPPED lpOverlapped  
  17. );  
  18.  
  19. BOOL ReadFile(                  //读文件  
  20.   HANDLE hFile,   
  21.   LPVOID lpBuffer,   
  22.   DWORD nNumberOfBytesToRead,   
  23.   LPDWORD lpNumberOfBytesRead,   
  24.   LPOVERLAPPED lpOverlapped  
  25. ); 

读者根据如上函数原型,不难理解如何使用Win32 API。在Visual C++(www.cppentry.com)中调用Windows API,大部分情况下需要包含一个windows.h。

现在动手

接下来我们体验一下如何调用文件操作API,来完成文件的读写。

【程序 2 11】使用Windows API输出茴字

  1. 01  #include "stdafx.h" 
  2. 02  #include <windows.h>  
  3. 03  #include <cstdio>  
  4. 04    
  5. 05  int main()  
  6. 06  {  
  7. 07      HANDLE hFile;  
  8. 08      DWORD nBytes;  
  9. 09    
  10. 10      //写入文件  
  11. 11      hFile = CreateFile( _T("test.out"),  
  12. 12          GENERIC_WRITE,  
  13. 13          FILE_SHARE_WRITE,  
  14. 14          NULL,  
  15. 15          CREATE_ALWAYS,  
  16. 16          0,  
  17. 17          NULL );  
  18. 18      char msg[] = "茴香豆的茴";  
  19. 19      if( hFile != INVALID_HANDLE_VALUE )  
  20. 20      {  
  21. 21          WriteFile( hFile, msg, sizeof(msg) - 1, &nBytes, NULL );  
  22. 22          CloseHandle(hFile);  
  23. 23      }  
  24. 24    
  25. 25      //读取文件  
  26. 26      hFile = CreateFile( _T("test.out"),  
  27. 27          GENERIC_READ,  
  28. 28          FILE_SHARE_READ,  
  29. 29          NULL,  
  30. 30          OPEN_ALWAYS,  
  31. 31          0,  
  32. 32          NULL );  
  33. 33      if( hFile != INVALID_HANDLE_VALUE )  
  34. 34      {  
  35. 35          char line[256] = {0};  
  36. 36          BOOL bResult;  
  37. 37          bResult = ReadFile(hFile,   
  38. 38              line,   
  39. 39              sizeof(line),   
  40. 40              &nBytes,   
  41. 41              NULL) ;   
  42. 42    
  43. 43          if (nBytes != 0 )   
  44. 44          {  
  45. 45              printf("%s\r\n", line);  
  46. 46          }  
  47. 47    
  48. 48          CloseHandle(hFile);  
  49. 49      }50 } 

运行该程序,读者将会发现项目目录下会生成一个test.out文件,同时控制台输出结果如图2-50所示。

 
图2-50  运行结果

可以看出,使用Windows API进行编程(www.cppentry.com),代码的可读性并不是很高。因此一般情况下,我们推荐使用标准库或者MFC类来进行操作。

光盘导读

该项目对应于光盘中的目录"\ch02\ WinApiWriter"。

【责任编辑:云霞 TEL:(010)68476606】

回书目   上一节   下一节

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇2.5.6 使用MFC/ATL 下一篇2.5.2 使用C++标准库(stdcpp)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容: