Windows下的函数
在进行Windows应用程序设计中,程序员除了需要知道有关一个函数的常用信息(例如函数的名字,近函数或远函数,返回类型以及应如何调用)之外,同时还要知道更多的内容:一个回调函数、引出函数或是一个引入函数。
引出函数:这个术语与一个函数如何在一个模块中说明而在另一个模块中被调用有关。引出函数是在一个模块中定义而在这个模块之外被调用的一种函数;或是被Windows或是被另一个模块调用。这些函数必须以一种特定的方式进行说明,并被编译器作非凡的处理。这样,当它们被调用时,它们会被正确地束定到合适的数据段上。DLL为其它模块提供要被调用的函数,因此,每个DLL一般都带有一个DLL库,以便应用程序可以合法地调用DLL中的函数。DLL库由DLL中每个引出函数的入口点组成。整个Windows API就是由构成Windows环境的不同的模块所引出的函数组成,这些API函数的入口点在一个名为IMPORT.LIB的DLL库中说明。
引入函数:在DLL中引出的函数若要能为一个模块调用,必须在这个模块中将这个函数说明为引入函数。由此可见引出函数和引入函数表达的是从两种角度处理同一个函数的术语:引出模块中的一个函数使得这个函数能被其它模块调用;调用引出函数的模块通过引入这个函数才能调用它。在制作Windows应用程序时,连接器自动包含一个名为IMPORT.LIB的库文件。这个文件答应应用程序调用Windows API中的函数。这个文件被称为引入库。引入库提供了应用程序与一个到多个DLL中可被这个应用程序调用的函数之间的连接。
回调函数:回调函数是一种非凡的引出函数,是由 Windows环境直接调用的函数。一个应用程序至少要有一个回调函数。当一条消息要交给应用程序处理时,Windows调用这个回调函数。这个函数对应于一个活动窗口,被称为这个窗口的窗口函数。因为许多应用程序至少建立一个窗口,并且Windows需要向这个窗口发送消息,所以,处理消息的函数必须由Windows调用。在请求Windows枚举它所维护的对象时,例如字体或窗口,Windows也要调用应用程序中的回调函数。当向Windows提出这样的请求时,就必须向Windows提供回调函数的地址。
由于引出函数是在不同的模块中被调用的,也就是说,调用者的代码段与被调用的引出函数的代码段不在同一个段中,因此,在所开发的Windows应用程序中,引出函数都被说明为远函数。为了程序运行的效率原因,引出函数都使用Pascal调用约定,这种调用约定不同于C调用约定的地方在于:
最左边的参数先入栈:Pascal调用约定的参数进入栈的顺序是函数调用中最左边的参数先入栈。C的调用约定与此相反,它采用最右边的参数先入栈。
被调用的函数负责从展中清除参数:Pascal调用约定的函数在返回时负责清除栈中的参数;C调用约定的函数不作这种工作,而由调用者来作;这样,当程序中调用了大量的使用C调用约定的函数时,为清除栈中的参数,在程序中要额外地增加许多代码。
全局标识符不保持原来的大小写(一般被为大写形式),也不在标识符前面加下划线。
为便于程序开发活动,在Windows.h中定义了两个类型名,用于在程序说明引出函数:
类型说明 WINAPI 等价于FAR PASCAL,说明该函数是一个引出函数,这个类型名只用于在DLL中说明引出函数,或在应用程序中对DLL中的引出函数进行函数说明时。 CALLBACK 等价于FAR PASCAL,说明该函数是一个回调函数,它常被用在应用程序模块中说明一个窗口函数或其它种类的回调函数
资料引用:http://www.knowsky.com/394651.html