网站导航免费论文 原创论文 论文搜索 原创论文 网学软件 学术大家 资料中心 会员中心 问题解答 原创论文 论文素材 设计下载 最新论文 下载排行 论文上传 在线投稿 联系我们
返回网学首页
网学联系
最新论文 推荐专题 热门论文 素材专题
当前位置: 网学 > 编程文档 > DELPHI > 正文
Delphi for Linux中应用共享对象库
来源:Http://myeducs.cn 联系QQ:点击这里给我发消息 作者: 用户投稿 来源: 网络 发布时间: 12/10/12
下载{$ArticleTitle}原创论文样式
。用前缀区别两种库是因为Linux的库用单一扩展(.so)。

◆ $SOSUFFIX 在库名与扩展名之间增加文本,指定版本或其它信息。

◆ $SOVERSION 在扩展名之后增加版本号。

◆ $SONAME 表示相关符号链名,由编译器自动生成。

例如,下列代码生成库libsimple.so.2.0.1和符号链libsimple.so.2。

library simple ;
uses
    SysUtils,Classes;
    //函数定义省略
    {$SOVERSION  ''2.0.1''}
    {$SONAME  ''libsimple.so.2''}



共享对象库的使用

Kylix应用程序使用SO库时,可以采用两种方式:一种是隐式链接(Implicit linking),也称静态装入;另一种是显式链接(Explicit Linking),也称动态装入。下面分别介绍这两种链接方式的使用方法、技巧及将窗体对象放入SO库的技术。

1.使用前的系统设置

自定义SO库建好后,Kylix应用程序调用时会报错,这是因为Kylix找不到新建库,必须对系统进行相关设置。这与在Delphi for Windows中使用DLL库不同,DLL库建好后只需将编译后的DLL文件放到Delphi主程序目录下即可使用。操作步骤如下:

◆ 将编译好的SO库文件放到Linux系统库目录/lib或/usr/lib下,或者在Linux系统库路径shell变量LD_LIBRARY_PATH中加入自定义SO库文件所在路径。

◆ 在根用户(root)下,用ldconfig命令刷新库缓冲区。

◆ 对Kylix执行文件使用ldd命令,查看该程序所关联的SO库。

2.隐式链接

隐式链接是指在应用程序开始执行时就将SO库文件加载到应用程序中。实现隐式链接并不难,只需在应用程序中加入库函数的声明语句及库的external定义从句,则库函数可以和一般局部函数一样使用。比如,要使用libMyFirstSO.so中的Add函数,则只要在应用程序中增加下面语句:

function Add (A:Integer;B:Integer):Integer;cdecl ;

external ''libMyFirstSO.so'';

3.显式链接

显式链接是应用程序在执行过程中可根据实际需要随时加载SO库文件,也可以随时卸载SO库文件,还可在运行时进行SO库的切换。而这些是隐式链接无法做到的。与隐式链接相比,显式链接具有更大的灵活性。

在Kylix中,要动态装入库和调用导出函数可以用Delphi仿真代码或自然Linux方法。下面分别介绍这两种方法。

(1)用Delphi仿真代码动态装入

在Windows中动态装入DLL是用Windows API函数—LoadLibrary或Delphi提供的SafeLoadLibrary函数完成的。找到库后,程序调用Windows API函数—GetProcAddress搜索DLL导出函数。若找到匹配,则返回所请求函数指针,并将这个函数指针转换成适当类型和调用。使用完后调用FreeLibrary,从内存中释放库。

Kylix中使用Pascal RTL仿真函数实现SO库动态装入。下面的例子只列出Kylix应用程序中与动态链接相关部分,而非完整Kylix单元文件代码。

unit DynaForm;
interface
uses
SysUtils,Classes,Qcontrols,Qforms;
type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
end;
var  Form1:TForm1;
implementation
{$R *.XFM}
type  TComputeInteger = function (x:Integer;y:Integer):Integer;cdecl;
//调用库函数接口类型定义
procedure TForm1.Button1Click(Sender:TObject);
var Handle :Thandle ;
   Compute :TcomputeInteger;
begin
  Handle:=LoadLibrary(''libMyFirstSO.so'');//动态装入库
  if Handle<>0 then //找到库
  begin
    Compute:=TcomputeInteger(GetProcAddress(Handle,''Add'');
//搜索库函数Add,并返回函数指针
 &
  • 下一篇资讯: 隐藏我的电脑中驱动器
  • 网学推荐

    免费论文

    原创论文

    浏览:
    设为首页 | 加入收藏 | 论文首页 | 论文专题 | 设计下载 | 网学软件 | 论文模板 | 论文资源 | 程序设计 | 关于网学 | 站内搜索 | 网学留言 | 友情链接 | 资料中心
    版权所有 QQ:3710167 邮箱:3710167@qq.com 网学网 [Myeducs.cn] 您电脑的分辨率是 像素
    Copyright 2008-2015 myeducs.Cn www.myeducs.Cn All Rights Reserved
    湘ICP备09003080号