关于应用程序和插件或DLL之间的关系

     (作者:不得闲
     原创贴,请尊重版权,转载请注名)
     近来一段日子,希望做一个可扩展功能的系统,于是就需要插件等接口的支持。前次说了准备用BPL来做插件,原因是因为DLL中的类和其宿主程序中的Delphi类是不同的,从而有时候或许或出问题。而且我用BPL也用来做了几个东西,也都正常,上次的例子提出来的也倒正常。可是当我将他用来做我的系统的插件的时候就出现问题了。
难道是用法有错!经过反复的转换,写了好几种方法,也请教了几个高手,但是最终还是一样的有问题。想来想去
忽然想到了在Delphi做DLL的时候,一般需要引进DLL的参数都有Application,Screen等!那个时候,只是看到别人说在DLL中的Application,Screen和在应用程序中的Application,Screen对象是不同的,如果要使他们之间没有错误的进行相互进行消息的访问和传递,就需要将主应用程序的Application传递过去,但是至于为什么不同,倒是从来没有想过!直到近来遇到这个问题,才想到这个上面来。
   先来看看Application和Screen这两个对象是如何在什么地方产生的。在Forms单元中Application是个全局变量,而在Delphi中,程序的所有消息处理都是先交给该对象来处理的,然后才转到下面来由各个控件等进行处理的。而该Application又是在什么时候产生的呢?通过追踪得知该对象产生于Controls单元中的InitControls方法,而该方法在Controls单元在初始化的时候就被调用,也就是说只要引用Controls就会产生Application对象。我们都知道在EXE程序中是有Application对象的,那么编译DLL的时候,同样如果引用了Controls单元则产生了一个Application对象,而该DLL中的Application对象显然和EXE中的对象不是同一个对象,那么当你在DLL中想要操作其宿主程序的Application的话,你就必须将你EXE程序中的对象传递过来替换Dll中的对象。这样你操作的才是和Exe中一样的对象。这就是为什么需要传递Application对象到Dll中去的原因了。
  而我遇到的这个问题也同样是这样,在BPL包中会用一个控件,而该控件引用的一个单元会初始化一些东西,这个初始化就会生成一些全局变量,而控件在使用的时候要通过这些全局对象来操作!然而我的控件只在EXE程序中而不在BPL包中,所以我在通过一个包中包含一些单元达到初始化一些方法和过程不能成功!原因就是我的EXE中控件需要的那个全局对象初始化在EXE中,而在调用BPL包初始化的时候,又会产生一个新的存在于包中的全局对象,所以无论我怎样初始化,初始化的也是包中的全局对象,EXE中的全局对象根本不会变。此时,将该全局对象传递过去,替换包中的全局对象,则初始化成功。
 
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/suiyunonghen/article/details/2207649
个人分类: Delphi编程
上一篇火影394话情报
下一篇黄鹤游
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭