CnPack Forum


 
Subject: 如何用程序代码安装构件?
chb
新警察
Rank: 1



UID 458
Digest Posts 0
Credits 4
Posts 4
点点分 4
Reading Access 10
Registered 2004-7-18
Status Offline
Post at 2004-7-18 17:03  Profile | Blog | P.M. 
如何用程序代码安装构件?

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



UID 2
Digest Posts 6
Credits 2385
Posts 1543
点点分 2385
Reading Access 102
Registered 2002-12-16
Location China
Status Offline
Post at 2004-7-19 09:36  Profile | Site | Blog | P.M. 
你可以试试以下的方法(没有测试过):
1、缷载包。
用GetModuleHandle通过bpl文件名找到模块句柄,再用SysUtils.UnloadPackage过程缷载该bpl。
2、安装包。
可以用SysUtils.LoadPackage来安装bpl。




Zhou JingYu
CnPack Administrator
http://www.cnpack.org/
Top
chb
新警察
Rank: 1



UID 458
Digest Posts 0
Credits 4
Posts 4
点点分 4
Reading Access 10
Registered 2004-7-18
Status Offline
Post at 2004-7-19 11:44  Profile | Blog | P.M. 
LoadPackage这个方法不行啊。
请各位想想办法。
我在IDE扩展菜单中已新增了一个菜单项(如安装构件),我想点击这个菜单项,让它安装一个c:\tchcom\tch.bpl构件包。
Top
zjy
管理员
Rank: 9Rank: 9Rank: 9



UID 2
Digest Posts 6
Credits 2385
Posts 1543
点点分 2385
Reading Access 102
Registered 2002-12-16
Location China
Status Offline
Post at 2004-7-19 13:24  Profile | Site | Blog | P.M. 
奇怪,这两天有空我研究一下吧。




Zhou JingYu
CnPack Administrator
http://www.cnpack.org/
Top
chb
新警察
Rank: 1



UID 458
Digest Posts 0
Credits 4
Posts 4
点点分 4
Reading Access 10
Registered 2004-7-18
Status Offline
Post at 2004-7-19 17:30  Profile | Blog | P.M. 
感谢yygw!

能得到yygw 您的指点,真的很感谢。
      我从cnpack的源码中学到了太多的东西。
Top
zjy
管理员
Rank: 9Rank: 9Rank: 9



UID 2
Digest Posts 6
Credits 2385
Posts 1543
点点分 2385
Reading Access 102
Registered 2002-12-16
Location China
Status Offline
Post at 2004-7-19 21:35  Profile | Site | Blog | P.M. 
不好意思,上午没测试就回复了帖子,刚才跟踪了一下 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 的内核了。




Zhou JingYu
CnPack Administrator
http://www.cnpack.org/
Top
 




All times are GMT++8, the time now is 2024-4-18 08:33

    本论坛支付平台由支付宝提供
携手打造安全诚信的交易社区 Powered by Discuz! 5.0.0  © 2001-2006 Comsenz Inc.
Processed in 0.006541 second(s), 7 queries , Gzip enabled

Clear Cookies - Contact Us - CnPack Website - Archiver - WAP