Mah*_*d_N 0 delphi packages bpl delphi-2010
我创建了一个包,我想使用我的包的BPL文件...
我的包有VCL.dcp和RTL.dcp作为必需的库,我在我的应用程序中加载此包没有任何错误,但当我想卸载它时,显示一个访问冲突!
如果我使用运行时包("vcl"和"rtl")构建我的应用程序,则不显示访问冲突!

这是什么意思 ?!我的应用程序需要VCL和RTL库来加载BPL吗?我想像DLL文件一样加载我的包,有什么解决方案吗?
我正在使用Delphi 2010
非常感谢 ...
您的BPL需要RTL和VCL包.如果你的应用程序并不需要他们,那么这意味着RTL和VCL单元被编译到EXE文件.当您的EXE加载BPL时,您现在有两个 RTL和VCL单元副本 - 一组副本来自EXE,第二个副本来自您的程序包隐式导致加载的RTL和VCL程序包.
德尔福无意适应这种情况.您可能拥有一个RTL分配的内存,并试图被其他RTL释放.或者,EXE中可能存在引用VCL包中的函数的函数指针.
我看到三个选项:
编译EXE以使用包.具体来说,它应该需要您的BPL所需的相同RTL和VCL包.
让你的BPL 不要求任何其他包.如果它不需要RTL和VCL,那么您的包使用的任何RTL和VCL单元都将被编译到您的BPL中.您最终会再次使用两个单独的副本,但它应该更好用,因为两个副本都不会认为它应该被共享.
像真正的DLL而不是像包一样加载你的包.你说你想像DLL一样使用它,所以这样做.使用LoadLibrary,然后使用GetProcAddress获取您想要调用的任何函数.如果你走这条路,最好不要让你的代码成为一个包.使它成为DLL,并导出仅使用您希望在其他DLL中找到的参数类型的函数,如整数,字符指针和记录指针,而不是字符串或对象.
应该清楚的是,第一种选择是最简单的.第二个可能会起作用,听起来就像你喜欢的那样,但我预计它会在它最终起作用之前产生更多的麻烦.如果您在此项目的生命周期内必须使用其他开发环境,则第三种选择是最佳选择.