总览

Windows提供了一个应用程序编程接口(API),供开发人员访问Windows的系统功能。经典的API被称为Windows API,主要由很多C函数组成,提供从处理进程、线程和其他低级对象的基本服务用来处理:用户界面、图形、网络以及其间的所有功能。

Windows编程技术

Windows提供的其他API样式,特别是从Windows Vista开始的API样式,都基于组件对象模型(COM)技术()——一种1993年发布的面向组件的程序范例,今天Windows中的许多组件和服务都在使用它。示例包括DirectX、Windows成像组件(WIC)、DirectShow、媒体基础、后台智能传输服务(BIT)、Windows管理仪器(WMI)等。COM中最基本的概念是接口——一个由单个容器下的函数集合组成的协议。当然,多年来,这两种基本API样式的各种包装器已经开发出来,有些是由Microsoft开发的,有些是由其他人开发的。:

  • 微软基金会类(MFC)-C++包装器(主要用于Windows所暴露的用户界面(UI)功能——使用Windows、控件、菜单、GDI、对话等。”
  • 活动模板库(ATL)——一个面向构建COM服务器和客户端的基于C++模板的库
  • Windows模板库*(WTL)-ATL的扩展,为Windows用户界面功能提供基于模板的包装。就功能而言,它与MFC相当,但更轻量级,并且不携带(大型)DLL(如MFC那样)。
  • NET-一个框架和运行时(公共语言运行时-CLR),提供大量服务,例如中间语言(IL)的即时(JIT)NET可以通过利用新的语言(C#是最著名的语言)来使用,这些语言提供了许多特性,其中许多特性抽象了Windows功能并提高了生产效率。.NET framework使用标准Windows API来实现其更高级别的功能。N
  • Windows运行时(WinRT)-这是在Windows 8及更高版本中添加的最新API层。其主要目标是开发基于通用Windows平台(UWP)的应用程序。这些应用程序可以打包并上传到Windows应用商店,任何人都可以下载。Windows运行时是围绕COM的增强版本构建的,因此它也包含作为其主要(但不仅仅是)构建块的接口。虽然这个平台是本地的(而不是基于.NET),但它可以被C++、C语言(和其他.NET语言)使用,甚至可以使用JavaScript——简化访问Windows运行时API。

Windows.h头文件中提供了大多数标准Windows API函数定义。在某些情况下,需要额外的标题以及额外的导入库。

第一个程序

  1. #include <stdio.h>
  2. #include <Windows.h>
  3. int main()
  4. {
  5. SYSTEM_INFO si;
  6. ::GetNativeSystemInfo(&si);
  7. printf("Number of Logical Process: %d\n", si.dwNumberOfProcessors);
  8. printf("Page size: %d\n", si.dwPageSize);
  9. printf("Process Mask:0x%p\n", (PVOID)si.dwActiveProcessorMask);
  10. printf("Minimum process address: 0x%p\n",si.lpMinimumApplicationAddress);
  11. printf("Maximum process addresss:0x%p\n", si.lpMaximumApplicationAddress);
  12. return 0;
  13. }
  1. #include <Windows.h>
  2. //字符串拷贝
  3. void wmain(int argc,const wchar_t* argv[])
  4. {
  5. WCHAR buffer[32];
  6. wcscpy_s(buffer,argv[1]);
  7. WCHAR* buffer2 = (WCHAR*)malloc(32 * sizeof(WCHAR));
  8. wcscpy(buffer2, argv[1]);
  9. free(buffer2);
  10. }
  11. //安全的计算字符串后拷贝
  12. //StringCchCopy(buffer, _countof(buffer), argv[1]);
  13. //StringCchCat(buffer, _countof(buffer), L"cat");
  14. //StringCchCopy(buffer2, 32, argv[1]);
  15. //StringCchCat(buffer2, 32, L"cat");

32 and 64

  1. #ifdef _WIN64
  2. printf("Processor Mask: 0x%016llX\n", si.dwActiveProcessorMask);
  3. #else
  4. printf("Processor Mask: 0x%08X\n", si.dwActiveProcessorMask);
  5. #endi

error

布尔类型与C++布尔类型不相同;BOOL实际上是一个32位有符号整数。非零返回值表示成功,而返回零(FALSE)表示函数失败。不要显式地针对真(1)值进行测试,这一点很重要,因为成功有时会返回不同的值。如果函数失败,则通过调用GetLastError可以获得实际的错误代码,GetLastError负责存储当前线程上发生的API函数的最后一个错误。换句话说,每个线程都有自己的最后一个错误值,这在Windows这样的多线程环境中是有意义的——多个线程可以同时调用API函数