一、概述
Delphi是Borland公司研制的高效的可视化开发工具,它既可用于开发系统软件,也适合于应用软件的开发。随着韩国网络游戏《传奇》的红火,其开发工具delphi也被更多的软件开发人员所熟知;C语言也是目前IT界运用最广泛的开发语言之一。最近由于工作方面的原因,需要提供delphi调用c/c++编写的动态库的例子。在不同的开发语言之间相互调用,除了要熟练掌握各种语言的编写技巧之外,还要了解各种语言对函数的处理机制与调用规则。本文讲述了delphi调用c语言的动态库的例子,其中介绍了一些函数调用方面的基础知识,以及如何将c++中的结构、数组、字符串等数据类型转换为delphi中对应数据类型,还引入了常用的但网络上不常见的一些技术,比如回调函数的定义与注册,并通过实例展示了delphi调用c语言的动态库的细节,供大家在学习开发过程中参考。
开发工具:vc++6.0、delphi7.0
二、基础知识
2.1、回调函数
软件模块之间总是存在着一定的接口,从调用方式上,可以把他们分为三类:同步调用、回调和异步调用。其中回调是一种双向调用模式,也就是说,被调用方在接口被调用时也会调用对方的接口;异步调用是一种类似消息或事件的机制,不过它的调用方向刚好相反,接口的服务在收到某种讯息或发生某种事件时,会主动通知客户方(即调用客户方的接口)。回调和异步调用的关系非常紧密,通常我们使用回调来实现异步消息的注册,通过异步调用来实现消息的通知。同步调用是三者当中最简单的,而回调又常常是异步调用的基础。
回调函数与普通函数的申明并无区别,但如果是不同的开发语言之间通过回调函数来传递与处理数据,则一定要注意在不同语言对回调函数的申明与实现时其函数调用约定必须保持一致。
2.2、函数调用约定
声明过程或函数时,可以指定调用约定(calling convention),尤其在以接口形式提供给其它语言工具使用时,则必须指定过程或函数的调用方式。
Delphi指定调用约定可以使用的指示字包括register、pascal、cdecl、stdcall以及safecall。C/C++调用约定有stdcall、cdecl、fastcall、thiscall、naked call等。
决定了传递给例程的参数的顺序,还影响参数从栈中的解除、参数传递时对寄存器的使用以及处理错误和异常等。缺省的调用约定是register。
下表是调用约定的简要概括:
指示字 |
参数顺序 |
参数删除者 |
寄存器传递参数 |
register |
从左到右 |
例程 |
是 |
pascal |
从左到右 |
例程 |
否 |
cdecl |