V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
JustinL
V2EX  ›  程序员

Delphi 开发中,既保护源码,又可以分模块 dubug 的方法

  •  
  •   JustinL · 2023-01-18 15:48:15 +08:00 · 1388 次点击
    这是一个创建于 435 天前的主题,其中的信息可能已经有所发展或是发生改变。

    背景:公司不是软件公司,所以对程序开发的流程其实不擅长。公司原来有一套 delphi 程序,是一个内部用的桌面程序,最近拿出来迭代,既需要修 bug ,也需要加功能。

    但是代码作者不想给出所有源码。所以请教一下,有没有可能做到:

    1. 代码作者还是拿着全套代码,但是会发出个别 form
    2. 其他人也能 debug 这个 form ?
    3. 最好能对原代码做尽可能少的改动

    我理解不单 Delphi 有这个需求?是不是其他编译型的语言也有这个需求?再次说明一下非专业软件公司,都是为了内部提高效率的软件,很多程序员的通用做法实在是不了解。谢谢! (delphi 节点好像有点冷清,姑且放在程序员节点,见谅。)

    defunct9
        1
    defunct9  
       2023-01-18 15:52:30 +08:00
    老古董了
    jstony
        2
    jstony  
       2023-01-18 15:54:30 +08:00
    乘着你们还用得上,让作者出个价卖给你们,回头烂家里更不值钱了:)
    JustinL
        3
    JustinL  
    OP
       2023-01-18 15:56:18 +08:00
    想强调一下,其实这个和 Delphi 老不老不强相关,因为本质是源码管理问题。
    hsfzxjy
        4
    hsfzxjy  
       2023-01-18 16:09:11 +08:00 via Android
    我记得 delphi 的 unit 可以编译成某种二进制的中间文件(好像是.dcu ),只发布 dcu 不公开源码,别人也可以编译,但看不到源码

    时间太久远了,不确定是对的
    JustinL
        5
    JustinL  
    OP
       2023-01-18 16:33:11 +08:00
    @hsfzxjy 非常感谢,是一个有用的信息。
    ahhui
        6
    ahhui  
       2023-01-18 17:23:55 +08:00
    作为 delphi 开发者来回答一下,不愿意释出源码的作者可以编译“release”版本的 dcu 文件,只要 dcu 文件和 dfm 文件存在,你都可以二次开发,编译都没问题。但是你只能改自己的代码,调试自己的代码,一旦要单步进入那个作者的代码,你只能看到 cpu 汇编指令,无法修改对应的源代码(因为你也没有源代码)。这是多数 vcl 第三方组件的分发方式。

    综上,楼主的 3 个疑问,答案都是“肯定”的。都可以做到。
    ahhui
        7
    ahhui  
       2023-01-18 17:26:08 +08:00
    对了,补充一点,这种分发方式有一个限制,就是对于不同版本的 IDE (包括打补丁和不打补丁,都是不同版本的),需要编译对应的 dcu 文件,一旦你的开发环境和那位作者的不一样,由于依赖的 vcl 本身的 dcu 版本不一样,可能会出现报错无法编译的问题。
    JustinL
        8
    JustinL  
    OP
       2023-01-18 17:38:19 +08:00
    @ahhui 非常感谢!关于“编译 “release” 版本的 dcu 文件”,请问是他那边整个项目都编译成一个 dcu ,还是每个 unit 都编译成 dcu ,得到一堆的 dcu s ?另一方面,我这边可以怎样引入这些 dcu ?
    vicalloy
        9
    vicalloy  
       2023-01-18 17:43:42 +08:00
    @ahhui 已经说的比较详细了。dcu 是 delphi 的静态链接库,有完整的 dcu 和资源文件就可以正常编译。
    原作者可以提供完整 dcu 和部分源代码。
    感觉是公司想省钱。找原作者好好谈谈,得这点钱还是不要省的好。
    vicalloy
        10
    vicalloy  
       2023-01-18 17:45:56 +08:00
    我印象中 Delphi 的 dcu 不包含调试信息,不区分 release 和 debug 版。每个.pas 都会生成一个 dcu 。你把 dcu 放到项目的搜索路径下就可以找到。
    terence4444
        11
    terence4444  
       2023-01-18 17:47:18 +08:00 via iPhone
    也可以考虑通过外部 dll 的方式调用?
    youxiachai
        12
    youxiachai  
       2023-01-18 17:47:22 +08:00
    为什么不出钱..直接买断....
    ahhui
        13
    ahhui  
       2023-01-18 17:48:16 +08:00
    @JustinL 他可以编译成不同的文件给你,有的文件不想给源代码,就编译 release 的版本,想给源代码,就带 pas 给你,但如果带 pas 给你,那他得编译两套,也就是 debug 和 release 的 dcus 都要给你,不然你在 ide 的 debug 下可能无法编译部分文件。

    你的项目中,点击 Project->Project Options, Delphi Compiler->Search path 里,加上它给你的所有 dcu 所在的目录即可编译。注意如果他给你了 debug 和 release 两个版本的 dcu ,那么你在 Project Options, Delphi Compiler, Target 里,要给 debug configuration 和 release configuration 设置不同的 Search path ( debug configuration 使用包含它 debug 版本的 dcus 文件的目录、release configuration 使用包含它 release 版本的 dcus 文件的目录),然后你直接在你的 pas 的 uses 里引用它的单元即可编译。
    ahhui
        14
    ahhui  
       2023-01-18 17:49:06 +08:00
    @vicalloy 包含调试信息的,而且依赖 rtl, vcl 里的 dcu 也是两套,不匹配无法在自己项目的 configuration 里编译
    ahhui
        15
    ahhui  
       2023-01-18 17:51:22 +08:00
    @terence4444 delphi 用 dll 挺麻烦的,接口写的不好踩的坑比 C++还麻烦。但是 delphi 用 bpl 是可以的,bpl 就是 delphi 自己的 dll 。但一样,要分 debug 和 release 版本,而且对应版本的 dcu 也必须带着,因为编译的时候还是会找这些文件。只不过 runtime 的 bpl 可以直接随软件发布,里面的 code 不会编译到最终 exe 里(减小 exe 体积很有帮助)
    ahhui
        16
    ahhui  
       2023-01-18 17:55:49 +08:00
    @JustinL
    @vicalloy 我好像觉得我把 debug 的 dcu 和 C++里的 linker 搞混了,哈哈哈,不确定 debug 的 dcu 是不是必须的了。但 release 的 dcu 是必须给的。不给 debug 的 dcu 应该也能编译。
    JustinL
        17
    JustinL  
    OP
       2023-01-18 21:16:52 +08:00
    @ahhui
    @vicalloy
    目前来看行得通了,十分感谢两位!谢谢!
    eibici
        18
    eibici  
       2023-01-19 09:57:35 +08:00
    不如痛下决心,重做一个。。。
    JustinL
        19
    JustinL  
    OP
       2023-01-19 10:26:34 +08:00
    @eibici 长远考虑是打算重做的,但是目前的使用需求也要优先满足……
    aqtata
        20
    aqtata  
       2023-01-19 11:29:42 +08:00
    楼上都是对的,答案就是 dcu 文件,类似 c++的 obj 文件,没有源码,但是可以链接到工程中编译。
    补充一点细节,dcu 文件和 delphi 版本是绑定的,比如用 xe 开发的 dcu 文件就不能在 xe2 中用了。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3338 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 40ms · UTC 13:24 · PVG 21:24 · LAX 06:24 · JFK 09:24
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.