首先,要知道: *** 作系统与用户间的接口有两种,一种是命令接口,另一种是程序接口。
什么是命令接口:
为了便于用户直接或者间接地控制自己的作业, *** 作系统向用户提供了命令接口,用户可以通过该接口向作业发出命令以控制作业的运行。该接口又进一步分为联机用户接口和脱机用户接口。(
参考资料:
什么是程序接口:
程序接口是提供给程序员在编程时使用的接口,是用户的程序取得 *** 作系统服务的唯一途径。可以说,程序接口是为用户程序在执行中访问系统资源而设置的。程序接口由一组系统调用命令(简称系统调用)组成。用户通过在程序中使用这些系统调用命令来请求 *** 作系统提供服务。
系统调用详解:
系统调用就是用户在程序中调用 *** 作系统所提供的一些子功能,每一个系统调用都是一个能完成特定功能的子程序。具体讲,系统调用就是通过系统调用命令中断现行的用户程序,而转去执行相应的子程序,以完成特定的系统功能;系统调用完成后,控制又返回到系统调用命令的下条指令,被中断的程序将继续执行下去。
需要注意的是:系统调用的执行是在管态下运行的。
Windows系统调用:
Windows *** 作系统提供了丰富的系统调用,这些系统调用又被进一步编写成不同的库函数后放入动态链接库DLL(DLL是动态链接库的英文缩写,全称是是Dynamic Link Library)中,这些库函数构成了Windows *** 作系统提供给程序员的编程界面,这个编程界面被称为应用编程接口API。
库函数:百科上的解释是:库函数顾名思义是把函数放到库里是别人把一些常用到的函数编完放到一个文件里,供别人用。别人用的时候把它所在的文件名用#include<>加到里面就可以了。
库分动态链接库和静态链接库。这些库是通过编译连接生成的(在编译软件里,可以设置文件生成库文件还是普通的EXE文件)。
其实库函数就好比是在word文件里写了几篇作文,然后保存成一个word文档,那么这个word文档就相当于一个库,里面的每一篇作文都是一个库函数。
动态链接库的英文缩写是DLL,Windows中,动态链接库一般被存放在C:\Windows\System目录下,DLL多数情况下是带有DLL扩展名的文件,但也可能是EXE或其他扩展名。
所以说:API函数可以看做是一些函数,在windows *** 作系统下,这些函数通常存放在动态链接库中,其头文件通常包含在windowsh中(windowsh是VC 或者VS中带的)。这些存放在动态链接库里的API函数是 *** 作系统与用户程序之间的唯一接口,用户程序只能通过这些库函数(API函数)请求 *** 作系统服务,即用户程序只能通过这些存放在动态链接库里的API函数来实现系统调用。当用户程序中使用了这些API函数时,通常会发生系统调用, *** 作系统进入管态下运行,系统调用结束后,再返回到用户程序继续往下执行。
其实,C语言中最常用的printf和scanf函数,最后都是通过系统调用来完成的不止这两个函数,其实C语言的标准库函数,很多都是通过系统调用实现的。而要使用系统调用,windows下必然要使用存放在动态链接库里的API函数。当然,我们在程序中也可以不采用系统调用,因为没人规定你必须使用系统调用(当然,有时候采用系统调用会简单的多)。比如完成一个简单的加法运算程序,又比如单片机C语言编程,都没有系统调用。
许多应用软件,安装后,在其目录文件夹里通常会有一些DLL文件,这些DLL就是给该软件来调用的。
网上对API的解释如下:
API是系统的基石,是Windows的一砖一瓦。
明确一个概念,软件是运行在系统平台的支持上的,软件的功能其实就是向系统伸请,并由系统完成这些功能的过程。
那么软件要做的事情如何传递给系统呢,也就是这些API的作用了,系统定义了这些API函数,做为支持软件执行系统功能的接口。
不同的 *** 作系统自然API会是不同的
mfc就是对api的封装啊就是很好的例子,候杰的深入浅出mfc正是讲这些原理的
API函数是针对 *** 作系统的,C语言运行时函数则是针对C语言本身的
运行时库就是 C run-time library,是C而非C++语言世界的概念:取这个名字就是因为你的C程序运行时需要这些库中的函数
C语言是所谓的“小内核”语言,就其语言本身来说很小(不多的关键字,程序流程控制,数据类型等);所以,C语言内核开发出来之后,Dennis Ritchie和Brian Kernighan就用C本身重写了90%以上的UNIX系统函数,并且把其中最常用的部分独立出来,形成头文件和对应的LIBRARY,Crun-time Library就是这样形成的。
随后,随着C语言的流行,各个C编译器的生产商/个体/团体都遵循老的传统,在不同平台上都有相对应的Standard Library,但大部分实现都是与各个平台有关的。由于各个C编译器对C的支持和理解有很多分歧和微妙的差别,所以就有了ANSI C;ANSI C(主观意图上)详细的规定了C语言各个要素的具体含义和编译器实现要求,引进了新的函数声明方式,同时订立了Standard Library的标准形式。所以C运行时库由编译器生产商提供。至于由其他厂商/个人/团体提供的头文件和库函数,应当称为第三方C运行库(Third party C runtime libraries)
C run-time library里面含有初始化代码,还有错误处理代码(例如divide by zero处理)。你写的程序可以没有math库,程序照样运行,只是不能处理复杂的数学运算,不过如果没有了C run-time库,main()就不会被调用,exit()也不能被响应。因为C run-time Library包含了C程序运行的最基本和最常用的函数。
到了C++世界里,有另外一个概念:Standard C ++ Library,它包括了上面所说的C run-time Library和STL。包含C run-time Library的原因很明显,C++是C的超集,没有理由再重新来一个C++ run-time LibraryVC针对C++加入的Standard C ++ Library主要包括:LIBCPLIB,LIBCPMTLIB和MSVCPRTLIB
Windows环境下,VC提供的 C run-time Library又分为动态运行时库和静态运行时库
WindowsAPI函数封装在一些dll文件中,如kernel32dll, gdi32dll, ntdlldll。
每个动态链接库dll文件有一个对应的lib文件,和静态lib将导出声明和实现都放在lib中,编译后所有代码都嵌入到宿主程序有所不同,动态lib相当于一个h文件,是对实现部分(dll文件)的导出部分的声明。链接器使用lib文件来解析对导入的函数/变量的引用,使生成的exe文件包含一个导入表,其中列出必须的DLL和导入的函数/变量以及函数/变量的具体位置。
这样系统在加载exe文件时,会根据导入表的内容同时加载必要的DLL文件,当程序需要使用DLL中的函数/变量时,可查询导入表以找到相应的位置。
MFC实际上也是调用了API来作图。你说的问题实际上是过去没MFC时,用C/C++和WIN API开发Windows程序的技术。这技术已经淘汰了!
MSDN上有WIN32程序开发的例子。 你用向导添加一个WIN32项目,再自己重写OnPaint()函数,最後用InvalidateRect(),来激发一个重画事件。
做图要用到API:
void OnPaint(HWND hWnd,UINT message, WPARAM wParam, LPARAM lParam)
{
PAINTSTRUCT ps;
HDC hdc;
hdc=BeginPaint(hWnd,&ps); //GetDC本质上调用了这个 <br>//在这里加画图代码。如: <br>Ellipse(hdc,0,0,100,100); //画圆 <br>Rectangle(hdc,0,100,100,200);//画矩形 <br>TextOut(hdc,50,50,_T("Hello, World"),6); //文字也是图</p><p>EndPaint(hWnd,&ps); //释放DC handle<br>}
这个是用windows API写程序的基本框架
这只是一个最框架,因为不了解你的功能的详细情况,所以剩下的就由你自己去填写与扩充
#include <Windowsh>
#include <iostream>
using namespace std;
LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam );
int WINAPI WinMain(
HINSTANCE hInst, //应用程序的当前句柄实例
HINSTANCE prevhInst, //应用程序的先前句柄实例
LPSTR cmdLine, //指向应用命令行的指针
int show) //窗口显示方式,该参数可以是下列值之一:
// SW_HIDE:隐藏窗口并且激活另外一个窗口。
// SW_MINIMIZE:最小化指定的窗口,并且激活在系统表中的顶层窗口。
// SW_RESTORE:激活并显示窗口。如果窗口已经最小化或最大化,系统将以恢复到原来的尺寸和位置显示窗口(与SW_SHOWNORMAL相同)。
// SW_SHOW:激活一个窗口并以原来的尺寸和位置显示窗口。
// SW_SHOWMAXIMIZED:激活窗口并且将其最大化。
// SW_SHOWMINIMIZED:激活窗口并将其最小化(以图标显示)。
// SW_SHOWMINNOACTIVE:将一个窗口显示为图标。激活窗口维持活动状态。
// SW_SHOWNA:以窗口的当前状态显示窗口。激活窗口保持活动状态。
// SW_SHOWNOACTIVATE:以窗口的最近一次的尺寸和位置显示窗口。激活窗口维持激活状态。
// SW_SHOWNORMAL:激活并显示窗口。如果窗口最大化或最小化,系统将其恢复到原来的尺寸和位置(与SW_RESTORE相同)
{
CoInitialize(NULL);
MSG msg = {0}; //创建并初始化msg
while(msgmessage != WM_QUIT)
{
if(PeekMessage(&msg,0,0,0,PM_REMOVE))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
else
{
}
}
CoUninitialize();
return 0;
}
LRESULT CALLBACK WndProc( HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam )
{
switch(message)
{
case WM_INITDIALOG:
break;
case WM_COMMAND:
break;
case WM_LBUTTONDOWN:
break;
case WM_MOUSEMOVE:
break;
case WM_LBUTTONUP:
break;
case WM_PAINT:
break;
case WM_CLOSE:
break;
case WM_DESTROY:
break;
case WM_QUIT:
break;
}
return 0;
}
HANDLE WINAPI CreateThread(
__in LPSECURITY_ATTRIBUTES lpThreadAttributes,
__in SIZE_T dwStackSize,
__in LPTHREAD_START_ROUTINE lpStartAddress,
__in LPVOID lpParameter,
__in DWORD dwCreationFlags,
__out LPDWORD lpThreadId
);
`CreateTread' undeclared (first use this function)
笔误?
所谓API(应用程序接口)是个很宽泛的概念,也就是别人已经写好的函数的集合。然后放在不同的库里,比如说<windowsh><stdioh>等等,我们每一次写代码,都会用到API。如果还有疑问,请追问。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)