小弟编写这样一个软件:软件结为主程序“动态”调用相应DLL模块实现。每个DLL中包含一个有共同继承祖先(TTemplatePageForm)的列表Form(称为PageForm),为调用每个DLL时要创建的窗体(非模态)。这个PageForm实例需要加载到主界面的一个ScrollBox中。我在DLL中只要求发布加载(LoadPage)和卸载(ReleasePage)PageForm实例的这两个函数,而其它的统一功能(可以来自于自定义接口或者TTemplatePageForm,在TTemplatePageForm或每个PageForm中实现)则希望通过主程序调用这个PageForm实实例的方法实现。出现并需要解决的问题:①无法将PageForm实例放到ScrollBox中;(分值:30)
②无法调用来自PageForm实列的统一功能函数;(注意:在DLL中不发布这些函数);(分值:70)结贴给分方法:
解决问题①:前三位得分为15:10:5;第一位解决者另外获得100分;
解决问题②:前三位得分为40:20:10;第一位解决者另外获得200分;希望实现者给上源代码,谢谢。

解决方案 »

  1.   

    不是很难,好好研究一下Dll的结构就很容易解决
    1、调用Dll时传递一个ScrollBox作为PageForm的Parent就可以解决了。
    2、如果不想发布这些函数,就建立一个自定义的消息,然后通过主控程序的消息来调用这些函数。
      

  2.   

    这个问题我一直在研究,但最终放弃使用DLL形式.采取BPL形式.
      

  3.   

    用带包编译的模式,就可以了,不论是否是Dll还是BPL都可以,很简单。如果不使用带包编译,使用DLL的话,天啊,受不了。
      

  4.   

    我也正在研究这个问题。用dll或者bpl都可以实现的。
    关键的是先定义好接口:插件和容器的接口。
    另外记得要uses sharemem.
    最好使用外部的rtl.bpl,vcl.bpl来编译。
      

  5.   

    To:gobiz(拔剑容易收剑难) 我用传递参数的方法传入ScrollBox,可是不行啊!
    另外,如果我要调用带参数且有返回值的函数呢?
      

  6.   

    TO: jackhatedance(jack)你现在做的实现了我的要求吗?有的话大家研究研究,不胜感激.
      

  7.   

    问题1,你可以把Form作为你接口的一个成员来实现
    问题2,应该没有问题吧,我没有这么做过,但是用类引用(class of )可以实现,用类引用只一个函数就可以了,实现把类传出来,然后在exe中创建和释放,跟在主程序中的类用着一样,呵呵
      

  8.   

    这个问题我已经基本解决了。我在程序中先定义了一个只包含虚函数的Form(IPageForm)作为EXE和DLL共同使用的接口,在DLL中的PageForm实例全部来自于实现了IPageForm的窗体(TemplatePageForm),而DLL只提供一个输出IPageForm的引用类,在EXE中创建相应的PageForm。但是这其中要注意,在EXE中通过DLL输出类创建的PageForm实例一定不要设定Parent属性,这样这个PageForm现实不出来。要让PageForm实例现实在ScrollBox中需要两个步骤:①DLL中的PageForm实例Create事件中加上ParentWindow := Application.Handle;②在EXE中通过Windows.SetParent(PageForm.Handle,ScrollBox.Handle)将PageForm放到ScrollBox中。但是还是出现些小问题:将PageForm的Align属性设置为alClient后,会出现PageForm的大小为扩大到桌面大小。