总览
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函数定义。在某些情况下,需要额外的标题以及额外的导入库。
第一个程序
#include <stdio.h>
#include <Windows.h>
int main()
{
SYSTEM_INFO si;
::GetNativeSystemInfo(&si);
printf("Number of Logical Process: %d\n", si.dwNumberOfProcessors);
printf("Page size: %d\n", si.dwPageSize);
printf("Process Mask:0x%p\n", (PVOID)si.dwActiveProcessorMask);
printf("Minimum process address: 0x%p\n",si.lpMinimumApplicationAddress);
printf("Maximum process addresss:0x%p\n", si.lpMaximumApplicationAddress);
return 0;
}
#include <Windows.h>
//字符串拷贝
void wmain(int argc,const wchar_t* argv[])
{
WCHAR buffer[32];
wcscpy_s(buffer,argv[1]);
WCHAR* buffer2 = (WCHAR*)malloc(32 * sizeof(WCHAR));
wcscpy(buffer2, argv[1]);
free(buffer2);
}
//安全的计算字符串后拷贝
//StringCchCopy(buffer, _countof(buffer), argv[1]);
//StringCchCat(buffer, _countof(buffer), L"cat");
//StringCchCopy(buffer2, 32, argv[1]);
//StringCchCat(buffer2, 32, L"cat");
32 and 64
#ifdef _WIN64
printf("Processor Mask: 0x%016llX\n", si.dwActiveProcessorMask);
#else
printf("Processor Mask: 0x%08X\n", si.dwActiveProcessorMask);
#endi
error
布尔类型与C++布尔类型不相同;BOOL实际上是一个32位有符号整数。非零返回值表示成功,而返回零(FALSE)表示函数失败。不要显式地针对真(1)值进行测试,这一点很重要,因为成功有时会返回不同的值。如果函数失败,则通过调用GetLastError可以获得实际的错误代码,GetLastError负责存储当前线程上发生的API函数的最后一个错误。换句话说,每个线程都有自己的最后一个错误值,这在Windows这样的多线程环境中是有意义的——多个线程可以同时调用API函数