在project/options/packages中选择Build with runtime packages即可。

解决方案 »

  1.   

    amo说的很对,在发布你的程序时与没有选择Build with runtime packages
    不同,具体请看delphi的帮助deploying your program.
      

  2.   

    1 我不知道你担心的是什么,Dll只能被动的被调用,它只有在被调用的时候才和应用程序相关联,用完了以后不知什么时候就被调出内存了,那120k的空间真的那么宝贵?
    2 如果你的很多Dll都要执行同样的操作,为何不写成1个Dll?
    3 如果一定要生成多个Dll,不妨把多个Dll公用Application的部分单独封装成一个Dll,再由别的Dll去调用这个对Application进行操作的Dll。(但如果仅仅是对Application进行简单操作,倒不如象amo说的那样调用Delphi提供的标准Dll)
     
      

  3.   

    首先我得感谢各位的热情解答。不过不能让人满意。
    1.带运行包是可以的,不过这不是Delphi推荐的作法。因为做好的安装盘,将
    运行包拷贝到system目录下,会与其它的软件发生冲突,譬如另一个应用程序
    也用带运行包运行,但版本却不一样,不是我的程序不能运行,就是他的程序
    不能运行。
    2.当能也可以将所有的DLL装到一个应用程序中,甚至连一个DLL也不要,全部
    代码装到一个EXE中。不过我用DLL的目的,主要是想在运行时能替换代码。用
    户可以选择不同的DLL来运行应用程序以达到不同的效果。
    3.Firing_Sky讲将所有与Application有关的处理放在一个DLL中,似乎有一定
    的道理,不过这个DLL中也得引用Forms。
      

  4.   

    有TApplication的源码,是否自己改写一个,只是包含自己使用的功能.
    120K重要吗?网上下载120K,30秒不到.
      

  5.   

    这样的话,你自己将forms单元改写一下,把不相干的内容都删掉。再把单元改个名字来引用不知能不能行得通
      

  6.   

    但是Dll本身就是违反类的原则的
      

  7.   

    Forms单元封装了窗口的属性,如果你的DLL中不包含可视化控件,如:Button、Memo等等,就可以大胆去掉该单元的引用。不过,在你编写的源代码中不能包含类似TForm1.的语句。换句话说,就是你的代码必须是纯代码(与VCL无关)。
    有兴趣的话,可以去http://bluebird22.east.net看看我写的一篇文章。
      

  8.   

    jll没有明白我的意思。我只需要Application这一全局变量。
      

  9.   

    有TApplication的源码,自己改写一个.
      

  10.   

    barton:
         如果你编写的DLL包Application的话,你实际上已经违反了编写DLL的一些约定,不值得提倡!如果你很在乎120K空间的话,应该把DLL中的内容放到主Form和主Unit中去,这样即快又稳,何乐而不为?
      

  11.   

    抱歉,由于本人疏忽,网址写错了。http://bluebird22.easthome.net
      

  12.   

    to Firing_Sky:还没有结果,为什么要了结?
    to jll:我不明白为什么DLL不可以使用Application这个全局变量,为什么就
    一定违反了DLL的一些约定,到底是哪些约定?我做成DLL的目的无非是要几个
    应用程序都可以使用一些公共例程,而这些例程又与Application有关。我不知道各位是否用过Dream Controls,这个控件包中含有十多个对话框,都要
    用到Application,因为要从MainForm中取得很多信息。当然我不需要,我只要
    在显示DLL中的对话框时系统不会认为是两个Application,而在任务条上显示两
    项任务。
      

  13.   

    大家知道Application是一个全局变量,在我们自己编写的DLL中一般应尽量避免传递全局变量(主要是VCL类,再就是形如Application之类的系统变量)。实际上并没有什么固定的条约来约束我们编写DLL,但作为一个优秀的程序员,应该尽量使自己的代码符合国际惯例。关于DLL的一些细节,建议大家参考Marco Cantu写的《Delphi 3 从入门到精通》(电子工业出版社)
      

  14.   

    jll的话听起来有一些道理,而且我一直坚持按“惯例”办。不过我要求在调用
    DLL时显示的窗体不在任务栏上显示出来并不过份吧,那么如何既不“违规”,
    又解决问题呢?
      

  15.   

    如果你的DLL在任务栏上显示出来,那它实际上是一个非模态窗口,你用模态窗口就行了。
    注意:这种非模态窗口其实和主窗口是不同步的,因为它们分别有各自的Application变量。如果你去掉DLL中的Application变量,应该就没有什么大问题了。
      

  16.   

    正好相反。我的DLL中是模式窗口。说得更明白一些:一个登录对话框。我的一套
    系统中多个可执行文件都要用到它。不过我已经用一个不怎么好的方法搞定了。
    传递Application的Handle值,传给DLL中的Application,浪费了我121K。因为如果
    窗体的Owner为空的话,系统会认为是另一个Application,任务栏上一定会显示。
      

  17.   

    窗体不在任务栏上显示出来: ShowWindow(Application.Handle, SW_HIDE);
    大功告成!
      

  18.   

    DLL调用时处理好,是不会在状态拦显示新窗体的。
    作法如下:
       在DLL调用过程中加入参数PAPP:TAPPLICATION,在过程中这样写:
    VAR
      OAPP:tAAPLICATION;
    BEGIN
      APPLICATION:=PAPP;
      {
        DO SOMTHING
       }
      APPLICATION:=OAPP;
    END;