Board logo

Subject: 如何用程序代码安装构件? [Print This Page]

Author: chb    Time: 2004-7-18 17:03     Subject: 如何用程序代码安装构件?

我扩展了delphi ide的菜单。由于我有两套构件包不能同时安装,我想在菜单中用代码控制包的安装,在不退出delphi的情况下两个包能随意切换,该如何做?*.bpl的路径都已知。
这边个个都是高手,望解答,不胜感谢。
Author: zjy    Time: 2004-7-19 09:36

你可以试试以下的方法(没有测试过):
1、缷载包。
用GetModuleHandle通过bpl文件名找到模块句柄,再用SysUtils.UnloadPackage过程缷载该bpl。
2、安装包。
可以用SysUtils.LoadPackage来安装bpl。
Author: chb    Time: 2004-7-19 11:44

LoadPackage这个方法不行啊。
请各位想想办法。
我在IDE扩展菜单中已新增了一个菜单项(如安装构件),我想点击这个菜单项,让它安装一个c:\tchcom\tch.bpl构件包。
Author: zjy    Time: 2004-7-19 13:24

奇怪,这两天有空我研究一下吧。
Author: chb    Time: 2004-7-19 17:30     Subject: 感谢yygw!

能得到yygw 您的指点,真的很感谢。
      我从cnpack的源码中学到了太多的东西。
Author: zjy    Time: 2004-7-19 21:35

不好意思,上午没测试就回复了帖子,刚才跟踪了一下 Delphi5 的 IDE,发现包的安装远比想象中的复杂。

ToolsAPI 并没有提供设计期包的安装和缷载接口,包的管理由 IDE 的内核 coride50.bpl 完成。在这个 bpl 中的 Pakmgr、Paklist、Pakload 等单元中实现了包管理器和列表等内部类,并在设计期维护着一份包列表类 TPackageList 的实例(包括已安装的和禁用的)。当我们在 IDE 中装载一个包时,IDE 内部实际上执行了很多的操作,包括检查包是否已安装/被禁用、检查包的 RequirePackage 列表等等,而不仅仅是调用 LoadPackage 这么简单。

暂时我还没有找到合适的方法来实现装载包的功能。因为 coride50.bpl 没有提供 dcp 文件(更没有源码可读^_^),没办法象访问 VCL 那样直接操作这些内部对象,而通过 coride50 的 dump 信息虽然可以看到一些类声明,不过也没有找到可以直接装载包的过程。

如果你有兴趣,可以试试自己去跟踪 IDE 的这部分代码,就算找不到方法,也可以了解不少东西,呵呵:)

跟踪 IDE 的方法:随便建一个 dll 工程,把 Host 设置成 delphi32.exe,运行后,通过 View 显示 Modules 窗口,找到 coride50.bpl 模块,在导出列表中查找有可能会调用的方法(如@Paklist@TPackageList@AddPackage$qqr17System@AnsiString),设个断点,就可以在 CPU 窗口中跟踪 IDE 的内核了。




Welcome to CnPack Forum (http://bbs.cnpack.org/) Powered by Discuz! 5.0.0