各位好,以前开发软件都是代码全部开放的,但这样容易造成核心代码泄露,现在我不想让团队中的其他人看到这些代码,应该怎么办?
    因为我的整个软件都是在几个模板窗体上继承下来的,而代码都是写在模板窗体的pas里,如果不发布pas,那么从模板继承下来的窗体在IDE中都不能打开了。所以,我想,如果只发布dfm和dcu就能在IDE中打开窗体就好了,这样有方法做到吗?

解决方案 »

  1.   

    第一,利用dll,用接口
    第二,提供dcu文件,可以编译,看不到代码
      

  2.   

    如果用dll的话,是不是就不能用模板窗体了?
    如果只提供dcu和dfm,就打不开界面了,我现在就卡在这里了
      

  3.   

    因为我的整个软件都是在几个模板窗体上继承下来的,而代码都是写在模板窗体的pas里,--->把Pas里的重要部分脱离出来,形成单独的pas,而这些单独的pas只发布dcu
      

  4.   

    软件的架构问题, 但说老实一句, 基窗体算不上什么核心代码的. 核心代码应该是另外写控件, 或者是DLL的模式的....
    假如整份软件的核心代码都在基窗体内, 可以很明白的说, 就算拿了里面的整份代码, 也很难在外面搞起来的. 因为你的核心代码, 百分百的跟你现有业务是紧密偶合起来, 分不开的. 换句话说, 拿出去不进行大量修改是不能够用来做其他软件的.
    而设计思路, 就算你隐藏了代码, 聪明点的人自然一眼就看出来的了, 隐藏不了的.
      

  5.   

    把 核心代码 与界面的pas分离
      

  6.   

    我们以前的做法,你可以参考下:1) 创建一个package,把不想开放的单元,包括窗体单元,都加到这个包里边2) 编译包,提供dcp和bpl给下面的开发人员(不需要提供dcu文件)。3) 在项目的工程文件中,添加该package至运行时包列表,具体如下:
       打开Delphi菜单“Component”-“Install packages”,在“Runtime packages”选项,
       勾选上“Build with runtime packages”,加入你的包名称。4) 发布时,需提供该bpl文件给用户,可一起放在可执行文件目录下。
    另外为了开发协作方便,建议最好:
    1) 把窗体单元中的业务逻辑代码分离,
    把这些代码单独到另外一个package中,不开放代码。2) 把无关要紧的窗体单元和一些界面处理代码,放在一个package中,
    包括代码文件,开放给底下的开发人员。3) 把需要继承的窗体单元,加入到Delphi的开发环境中,以便直接能在工程中创建子类。
    (放在另外的包中,在“Add New Form”时没办法像同一个工程中那样方便添加继承窗口)。需要做的事情是修改下Delphi的ObjRepos文件,
    如果是Delphi7或早点版本,这个文件是bin目录下的delphi32.dro,
    如果是Delphi2007或之后版本,这个文件是
    $(BDS)\ObjRepos\BorlandStudioRepository.xml

    $(BDS)\ObjRepos\RADStudioRepository.xml
      

  7.   

    不是担心拿到外边,是不想让团队的其他成员知道整个软件的框架。
    说老实话,这个框架没有跟业务紧密结合(但是面向管理系统方面的),此框架就是另一个系统的,移植到这个软件上面就很快完成了。核心代码分离我也试了,需要改动的地方比较多,主要是参数传递方面的,不是太好的方法,如果能直接脱离pas或者加密起来最好了,但我没实现,所以来问问,如果实在没办法只有采用分离的方法了。
      

  8.   

    封装dll,这是最好的方法...........
      

  9.   

    第二,提供dcu文件,可以编译,看不到代码不明白,可否赐教一二
      

  10.   

    把 核心代码 与界面的pas分离。
    核心代码写到一个独立的abc.pas中,你的源码uses引用该pas,最简单。然后编译,得到abc.dcu,然后发布除了abc.pas以外的你的所有文件。
    这样解决了工程中打开窗体时报到不到pas文件的错误。
    别用DLL的方法,不方便。
      

  11.   

    各位好!经过我昨天一天的努力,想了各种办法,终于达到了我最初的目的,现在把方法公布出来,给其他有类似需求的网友提供方便。
    1、按照常规开发出需要pas(假定这个pas的名字为test.pas)及dfm(test.dfm),并生成test.dcu
    2、复制test.pas,创建其副本(假定此副本的名字为copy.pas),将copy.pas里面的自己写的procedure及function都删掉,将窗体、控件对应的procedure保留(这些procedure必须保留,否则会报错的),但可以注释掉里面代码,最后只留空壳就行了
    例如:本来的button1的事件如下:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     ShowMessage(DateTimeToStr(Now));
    end;
    可以处理成这样:
    procedure TForm1.Button1Click(Sender: TObject);
    begin
     //
    end;
    注意:这个begin end里面一定要有“//”,否则如果这个事件里没有任何代码就会被编译器自动处理掉
    3、把test.dcu设为只读,把test.pas移到其他文件夹,把copy.pas放到原来test.pas的文件夹下,并将copy.pas重命名为test.pas
    4、在编译器的编译前及编译后事件(这些事件是delphi2007及其以后版本才支持的)中添加批处理命令,编译前及编译后事件的位置可从此处找到:
    主菜单-->project-->options-->build Events,
    在pre-build中写如下代码:if exist  test.pas ren test.pas test.@pas  
    在post-build中写如下代码:
    if exist  test.@pas ren test.@pas test.pas
    注:这样做的目的是为了避免编译器在编译时重新生成test.dcu,故在编译前将此文件改名,编译后再改回来,这样达到了既不重新生成test.dcu,又在IDE中打开test窗体时不报错的目的。
    5、好了,现在可以发布test.dcu,test.dfm及空壳的test.pas了,因为编译前及编译后事件是写在项目的.dproj文件中的,所以还要发布.dproj文件,为了避免出问题,最好在发布时将这些文件置为“只读”文件。
    --by阿木
      

  12.   

    公布单元接口,只提供DCU,不提供PAS文件
      

  13.   

    我来说一下最终的实验结果,我上面用的那种方法还是不太好用,主要问题出在,打开子窗体时IDE会在后台自动打开基类窗体,而编译器会自动编译当前已打开的窗体,从而会重新生成基类窗体的DCU,为了避免重新生成DCU,需要在编译时将所有基于基类的窗体都关闭掉,这样做最终也很麻烦,所以我最终决定抛弃这种方法,采用楼上几位朋友讲的方法,将代码放到单独的pas中,然后在带窗体的pas中调用它们,这样感觉更主流一些,只是我要改动的比较多了……