首页> 中国专利> 动态链接函数库与主应用程序共享静态链接函数库的方法

动态链接函数库与主应用程序共享静态链接函数库的方法

摘要

一种动态链接函数库与主应用程序共享静态链接函数库的方法,主应用程序链接一静态链接函数库,由动态链接函数库建立静态链接函数库的函数指针变量与变量指针变量;接着,将动态链接函数库程序代码中有关调用静态链接函数库的函数部分转换为函数指针变量;再将动态链接函数库程序代码中调用静态链接函数库的变量部分转换为变量指针变量;最后,分别编译主应用程序与动态链接程序码为函数库,其中动态链接函数库相关函数与变量已经通过指针方式取代,于主应用程序中加载动态链接函数库同时会将函数及变量的存储位置传给动态链接函数库,使得动态链接函数库中所调用到静态链接函数库的函数与变量的部分都可以共享主应用程序所链接的静态链接函数库。

著录项

  • 公开/公告号CN101131635A

    专利类型发明专利

  • 公开/公告日2008-02-27

    原文格式PDF

  • 申请/专利权人 凌阳科技股份有限公司;

    申请/专利号CN200610111912.1

  • 发明设计人 周宏霖;朱盈州;

    申请日2006-08-24

  • 分类号G06F9/44;

  • 代理机构北京安信方达知识产权代理有限公司;

  • 代理人龙洪

  • 地址 台湾省新竹科学工业园区创新一路19号

  • 入库时间 2023-12-17 19:45:36

法律信息

  • 法律状态公告日

    法律状态信息

    法律状态

  • 2017-10-13

    未缴年费专利权终止 IPC(主分类):G06F9/44 授权公告日:20100407 终止日期:20160824 申请日:20060824

    专利权的终止

  • 2010-04-07

    授权

    授权

  • 2008-04-23

    实质审查的生效

    实质审查的生效

  • 2008-02-27

    公开

    公开

说明书

技术领域

本发明涉及一种软件组件的链接技术,特别涉及一种动态链接函数库与主应用程序共享一静态链接库的方法。

背景技术

在设计手机开发工具时,为了要实现所见即所得的效果,通常软件工具设计者会针对开发工具环境额外设计支持的动态组件。然而如何让应用软件设计者能在设计阶段与执行阶段共享一样的程序代码,将动态组件通过标准化接口整合到开发环境中,将会是支持动态软件组件设计者重要的议题。

已知的动态软件组件技术中,主要以微软公司的OLE/COM的设计最为普遍。OLE/COM技术是通过PE32的档格式,来部署每一个OLE/COM组件。由于OLE/COM组件的角色如同动态链接函数库的运作机制,也因此在内存的对应中,所有的组件在彼此互相参考与函数调用时,都可以通过动态的COM接口(COM Interface),链接到目前调用的该OLE/COM组件所存在的内存中。也因此,对这样的软件组件设计时,内存对应的问题可以完全由操作系统内部的内存机制来处理。图1为已知一个应用程序MainApp.exe同时加载多个COM组件时的内存分布示意图。如图1所示,应用程序MainApp.exe同时参考多个COM组件(COM.DLL#1~COM.DLL#4、COM.OCX#5)。该多个COM组件在内存时也可以彼此互相参考对方。

而Borland公司也利用BPL(Borland Package Library)的动态加载套装(Package)格式,而达到动态加载的功能。对于用Delphi或是C++Builder发展工具(development tools)所开发的软件而言,若是希望经由执行对象(runtime object)而节省内存,则可通过BPL达成类似于DLL/COM的目的。其类似动态链接函数库(dynamic link library,DLL)技术,是通过内存对应,让周边支持的软件组件可以依据需求动态加载到内存中。

虽然,目前软件组件的领域已经有动态加载组件技术。但对于嵌入式系统(embedded system)而言,这类的动态加载软件组件反而显得过于庞大与复杂。因此在嵌入式系统的领域,通常只有两种选择:

(1)软件组件都通过静态链接设计:此技术除非拥有编译(compiler)技术和切割区块编译,否则无法通过软件组件来实现藉由设计工具得到所见即所得效果。

(2)提供两种版本的可视化软件组件:此技术好处是可将其中一个版本可视化软件组件针对设计工具需求提供接口,以实现所见即所得的设计效果。但坏处则是对于该可视化软件组件设计人员而言依赖性过高。该可视化软件组件设计工程师必须要付出较大心力。同时对于使用该可视化软件组件的客户而言,客户不容易自行设计新的组件加入其软件中。

针对嵌入式系统中动态加载的问题,已知技术是将应用程序编译成为执行文件,而将周边的函数库编译成为动态链接函数库(dynamic link library,DLL)。两者主要都跟核心函数库(core.lib)做链接。如此虽然可以满足动态实时加载的需求,同时又可以避免必须要特定编译器技术的限制。然而这种技术会形成内存空间的浪费。图2为已知一个应用程序Design_Form.exe同时加载两个动态链接函数库(DLL)时的内存分布示意图。如图2所示,因为该执行档(Design_Form.exe)与所有的动态链接函数库(DLL)都会跟核心函数库(core.lib)进行静态链接。因此如果有两个动态链接函数库(Widget.DLL#1、Widget.DLL#2)与一个执行档(Design_Form.exe),就会有三个核心函数库(core.lib)重复的程序代码在内存中出现,而形成内存空间的浪费。由于有的动态链接函数库(DLL)都会有一个静态链接的核心函数库(core.lib)程序代码。当有的动态链接函数库(DLL)被加载到内存后,反而会形成内存空间的浪费。

针对内存空间的浪费的问题,另一种解决方法是把所有的函数库都通过静态函数库链接。如图3所示,由于所有静态链接的核心函数库(core.lib)本体都只有一份,这种方式可节省内存的使用,然而这种技术却缺乏动态加载的好处,同时减少使用者对于系统设计上的弹性需求。因此,已知的文件系统仍存有诸多的缺失而有予以改进的必要。

发明内容

本发明的主要目的是提供一种动态链接函数库与主应用程序共享静态链接函数库的方法,能让同样的软件组件程序代码通过编译为动态链接函数库与静态函数库的方式分别在执行阶段与设计阶段达到一样的呈现效果。

本发明的另一目的是提供一种动态链接函数库与主应用程序共享静态链接函数库的方法,能针对嵌入式系统的需求将同样的程序代码同时适应于动态加载机制与静态链接的机制,以便于让组件的设计者与使用组件的应用程序设计者都可以享受到跨平台工具的设计好处。

本发明的再一目的是提供一种动态链接函数库与主应用程序共享静态链接函数库的方法,能减轻内存需求,并减少开发组件设计的复杂度。

为达成上述的目的,本发明提出一种动态链接函数库与主应用程序共享静态链接函数库的方法,该主应用程序链接至少一静态链接函数库及一程序代码,该方法包含下列步骤:(A)于主应用程序中,建立该至少一静态链接函数库的一函数指针变量结构,并建立该函数指针变量结构与该至少一静态链接函数库的函数之间的链接;(B)于主应用程序中,建立该至少一静态链接函数库的一变量指针变量,并建立该变量指针变量与该至少一静态链接函数库的变量之间的链接;(C)将该程序代码中调用到的该至少一静态链接函数库所属的函数转换为对应的函数指针变量;(D)将该程序代码中调用到的该至少一静态链接函数库所属的变量转换为对应的变量指针变量;以及(E)编译该程序代码为动态链接函数库,于主应用程序中加载该动态链接函数库,并将函数及变量的存储位置由主应用程序传给该动态链接函数库。

为达成上述的目的,本发明又提出了一种动态链接函数库与主应用程序共享静态链接函数库的方法,该动态链接函数库链接至少一静态链接函数库,该方法包含下列步骤:(a)于该动态链接函数库中,建立该至少一静态链接函数库的一函数指针变量结构,并建立该函数指针变量结构与该至少一静态链接函数库的函数之间的链接;(b)于该动态链接函数库中,建立该至少一静态链接函数库的一变量指针变量,并建立该变量指针变量与该至少一静态链接函数库的变量之间的链接;(c)将主应用程序中调用到的该至少一静态链接函数库所属的函数转换为对应的函数指针变量;(d)将主应用程序中调用到的该至少一静态链接函数库所属的变量转换为对应的变量指针变量;以及(e)编译该动态链接函数库程序代码为动态链接函数库,于主应用程序中加载该动态链接函数库,并将函数及变量的存储位置由动态链接函数库传给该主应用程序。

通过本发明技术,同样的软件组件程序代码可以通过编译为动态链接函数库与静态函数库的方式分别在执行阶段与设计阶段达到一样的呈现效果。也就是说,本发明技术针对嵌入式系统的需求将同样的程序代码同时适应于动态加载机制与静态链接的机制,以便于让组件的设计者与使用组件的应用程序设计者都可以享受到跨平台工具的设计好处。同时,在开发使用者工具时,本发明技术可以减轻内存需求,并减少开发组件设计者的复杂度。

附图说明

图1为已知一个应用程序同时加载多个COM组件时的内存分布示意图;

图2为已知一个应用程序同时加载两个动态链接函数库(DLL)时的内存分布示意图;

图3为已知一个应用程序同时加载两个动态链接函数库时的内存分布示意图;

图4是本发明一种动态链接函数库软件组件与主应用程序共享静态链接函数程序代码的方法的流程图;

图5是本发明一个主应用程序同时加载多个动态链接函数库时的内存分布示意图。

具体实施方式

在本发明的动态链接函数库与主应用程序共享静态链接函数库的方法中,如以需求一个应用程序Design_Form.exe及两个动态链接函数库(Widget.DLL#1、Widget.DLL#2)而言,本发明的技术是通过Design_Form.exe加载一个核心函数库Core.lib,而其它的Widget.dll都会通过函数指针变量与全局变量指针变量的方式共享同一个Core.lib,而减少内存的使用量,并达到动态链接的目的。

在本发明的动态链接函数库与主应用程序共享静态链接函数库的方法中,主要是针对核心软件函数库为静态链接的环境所提出的解决方案。也就是动态组件与引用动态组件的主程序底层都是通过静态链接函数库提供基础调用。经由本发明的技术,同样的软件组件程序代码可以分别编译为动态链接函数库与静态函数库的方式,而分别在执行阶段与设计阶段达到一样的呈现效果。

图4是本发明的动态链接函数库与主应用程序共享静态链接函数库的方法的流程图。该主应用程序Design_Form.exe链接一静态链接函数库Core.lib及一程序代码。首先于步骤S410中,于主应用程序Design_Form.exe中,建立该静态链接函数库Core.lib的一函数指针变量结构,并建立该函数指针变量结构与该静态链接函数库Core.lib的函数之间的链接。

若该静态链接函数库Core.lib中提供如表1函数与全局变量。

  void Func_A(int X1);  int Func_B();  char Func_C(char*X2);  unsigned long v_A;  int v_B;  unsigned char v_C;  unsigned char*v_D;

表1

则于步骤S410中,建立如表2名称为func_p的函数指针变量结构(struct)。并在主应用程序Design_Form.exe中,建立如表3所示的该函数指针变量结构func_p与该静态链接函数库Core.lib的函数之间的链接。

  struct func_p{  void(*Func_A)(int X1);  int(*Func_B)();  char(*Func_C)(char*X2);  }funcs;

表2

  funcs.Func_A=Func_A;  funcs.Func_B=Func_B;  funcs.Func_C=Func_C;

表3

于步骤S420中,于主应用程序Design_Form.exe中,建立该静态链接函数库Core.lib的一变量指针变量,并建立该变量指针变量与该至少一静态链接函数库的变量之间的链接。例如,建立如表4名称为variable_p的变量指针变量。并在主应用程序Design_Form.exe中,建立如表5所示的该变量指针变量variable_p与该静态链接函数库Core.lib的变量之间的链接。

  struct variable_p{  unsigned long*v_A;  int*v_B;  unsigned char*v_C;  unsigned char**v_D;  }variables;

表4

  variables.v_A=&v_A;  variables.v_B=&v_B;  variables.v_C=&v_C;  variables.v_D=&v_D;

表5

于步骤S430中,将该程序代码中调用到的该静态链接函数库Core.lib的函数转换为函数指针变量。如表6所示,例如该程序代码中调用该静态链接函数库Core.lib的void Func_A(int X1)函数,则更换为调用一函数指针变量void(*Func_A)(int X1)。

  void(*Func_A)(int X1);  int(*Func_B)();  char(*Func_C)(char*X2);

表6

于步骤S440中,将该程序代码中调用到的该静态链接函数库Core.lib的变量转换为变量指针变量。表7所示,例如该程序代码中调用该静态链接函数库Core.lib的unsigned long v_A变量,则更换为调用一变量指针变量unsigned long*v_A。

  unsigned long*v_A;  int*v_B;  unsigned char*v_C;  unsigned char**v_D;

表7

于步骤S450中,编译该程序代码为动态链接函数库Widget.DLL,于主应用程序Design_Form.exe中加载该程序代码的动态链接函数库Widget.DLL,并将静态链接函数库Core.lib函数及变量的存储位置传给该动态链接函数库Widget.DLL。

于步骤S460中,该程序代码的动态链接函数库Widget.DLL被加载后,依据主应用程序Design_Form.exe所传送的函数及变量的存储位置,更正其调用该静态链接函数库Core.lib的函数及变量。

该程序代码的动态链接函数库Widget.DLL是利用该函数指针变量结构,以更正其调用该静态链接函数库Core.lib的函数。如表8所示,例如该动态链接函数库Widget.DLL中的Func_A函数则更换为函数指针变量funcs->Func_A。

  Func_A=funcs->Func_A;  Func_B=funcs->Func_B;  Func_C=funcs->Func_C;

表8

该程序代码的动态链接函数库Widget.DLL是利用该变量指针变量,以更正其调用该静态链接函数库Core.lib的变数。如表9所示,例如该动态链接函数库Widget.DLL中的v_A变量则更换为变量指针变量variables->v_A。

  v_A=variables->v_A;  v_B=variables->v_B;  v_C=variables->v_C;  *v_D=variables->v_D;

表9

因此执行完步骤S460后,该动态链接函数库Widget.DLL中所有调用函数与调用全局变量的动作,都如表10所示。

 Func_A(1); *v_D=Func_C(332); *v_B=Func_B(); ......etc

表10

图5是本发明一个主应用程序Design_Form.exe同时加载多个动态链接函数库时的内存分布示意图。由图5可知,本发明的实施例中,核心函数库(core.lib)的本体都会只有一份,而即可节省内存的使用,同时也可达到动态链接的目的,同时增加使用者对于系统设计上的弹性需求。

于其它实施例中,该程序代码也可编译为静态载入库,其是直接与该至少一静态链接函数库链接。

在另一实施倒中,又提供了一种动态链接函数库与主应用程序共享静态链接函数库的方法,该动态链接函数库链接至少一静态链接函数库,该方法包含下列步骤:

(A)于该动态链接函数库中,建立该至少一静态链接函数库的一函数指针变量结构,并建立该函数指针变量结构与该至少一静态链接函数库的函数之间的链接;

(B)于该动态链接函数库中,建立该至少一静态链接函数库的一变量指针变量,并建立该变量指针变量与该至少一静态链接函数库的变量之间的链接;

(C)将主应用程序中调用到的该至少一静态链接函数库所属的函数转换为对应的函数指针变量;

(D)将主应用程序中调用到的该至少一静态链接函数库所属的变量转换为对应的变量指针变量;以及

(E)编译该动态链接函数库程序代码为动态链接函数库,于主应用程序中加载该动态链接函数库,并将函数及变量的存储位置由动态链接函数库传给该主应用程序。

(F)该主应用程序加载动态链接函数库后,主应用程序取得来自动态链接函数库的函数及变量的存储位置,利用该函数指针变量结构,以动态更正其调用该至少一静态链接函数库的函数,利用该变量指针变量,以动态更正其调用该至少一静态链接函数库的变量。

同样的,所述变量指针变量为全局变量指针变量,所述静态链接函数库为核心函数库。所述方法较佳应用于一嵌入式系统。该实施例与第一实施例的机制是相同的,不再赘述。

通过这样的机制,原本在动态函数库中所调用的变量就可以随着主应用程序或其它相关工作运作需要,而有对应的变量改变。在原本的传统设计中,每个Dll与主应用程序在连结静态函数库时,相关的变量都会被各自包括到每个Dll与应用程序Data Segment中,也因此如果其中的变量有任何的修改,是无法反映到所有的Dll与应用程序中的,透过全局的变量指针变量方式可协助我们达到支持此目的。

本发明技术保留动态加载函数库(Dynamic Loading Library)的便利性,并针对嵌入式系统的限制(Static-Link Library),提供了一套经由函数指针变量与全局变量指针变量在动态链接函数库加载到内存后,动态进行链接的技术。

本发明技术与奎尔(Qualcomm)公司的Brew Resource Editor技术差异点在于:奎尔(Qualcomm)公司的Brew Resource Editor这套工具主要是提供静态且缺乏所见及所得效果的机制,使用者仍需透过编译器编译后,才能看到自己设计出来的效果。

本发明技术与Borland公司的Borland C++Builder/Delphi技术差异点在于:Borland公司的Borland C++Builder/Delphi主要分为执行套件(RuntimePackage)与设计套件(Design Time Package)。执行套件(Runtime Package)就如同一般的动态链接函数库(DLL),设计套件(Design Time Package)就如同是静态链接的对象。但是经过Borland公司预先处理过,与本发明技术差异点在于Borland公司的设计套件(Design Time Package)背后仍是通过Borland公司的动态链接函数库进行链接。而本发明技术是通过主程序链接到主程序的内部静态链接函数库,其设计意义是完全不同。本发明技术是在嵌入式实时操作系统(Embedded RTOS)中,在这类环境并没有支持动态链接函数库加载的动作,因此本发明将可在嵌入式实时操作系统(Embedded RTOS)中提供绝佳的设计效益。

本发明技术与微软公司的OLE/OCX/COM技术差异点在于:微软公司的OLE/OCX/COM主要仍是通过动态加载函数库的内存对应机制来实现对象的共享性,与本发明所提供的通过函数指针变量与全局变量指针变量共享主程序的静态函数库数据是不同的技术。

综上所述,通过本发明技术,同样的软件组件程序代码可以通过编译为动态链接函数库与静态函数库的方式分别在执行阶段与设计阶段达到一样的呈现效果。也就是说,本发明技术针对嵌入式系统的需求将同样的程序代码同时适应于动态加载机制与静态链接的机制,以便于让组件的设计者与使用组件的应用程序设计者都可以享受到跨平台工具的设计好处。同时,在开发使用者工具时,本发明技术可以减轻内存需求,并减少开发组件设计者的复杂度。

上述实施例仅是为了方便说明而举例而已,本发明所主张的权利范围自应以权利要求所述为准,而非仅限于上述实施例。

去获取专利,查看全文>

相似文献

  • 专利
  • 中文文献
  • 外文文献
获取专利

客服邮箱:kefu@zhangqiaokeyan.com

京公网安备:11010802029741号 ICP备案号:京ICP备15016152号-6 六维联合信息科技 (北京) 有限公司©版权所有
  • 客服微信

  • 服务号