我想知道是否有人知道一种优雅的方法来确定给定(编译)的DLL,EXE或BPL所需的BPL.
我不确定这是否可能只是简单地扫描二进制文件引用.bpl文件名(这可能容易出现误报).
理想情况下,我想返回一个TStringList甚至以逗号分隔的内容,String其中包含所有必需的.bpl文件的名称.
我正在尝试构建一个包含DWS编译器的包(包A).它工作,但当我有一个第二个包(包B),需要包A,包含任何使用 DWS特定单位的单位,我得到错误:
[DCC致命错误] E2225永不建立包'包A'必须重新编译
如果我将包A更改为按需重新编译,则错误不会消失.我反而得到了
[DCC致命错误] F2084内部错误:U10346
在同一点上.
我在http://code.google.com/p/dwscript/issues/detail?id=419上发布了一个错误报告,看起来问题在作者端无法重现,这意味着我的问题出现了问题.结束.他提出了一些有用的建议:"我有时会因为流浪的DCU而看到这个错误."
即使在重新启动IDE和计算机之后,搜索和删除可能相关的所有DCU也无法解决问题.
在编译过程中使用Process Monitor在BDS上运行跟踪并未显示任何看起来相关的内容.
有没有人对如何追踪这个有任何想法?使用Delphi XE,更新1.
交叉发布到Delphi论坛.让我们先看看谁提出了解决方案.
如果路径中没有一些运行时包,我的Delphi7项目将无法在我的客户端计算机上运行.例如rtl70.bpl
我有Build未运行的运行时包,所以它们不应该被编译到exe中吗?
编辑:项目使用Jedi包(TJvPlugin)并运行程序没有安装任何插件工作正常.在我添加插件后,bpl未找到的错误重新出现.好像不得不忍受额外的包裹.
我正在自己的包装上工作.然后,当我正在处理我错误地点击消息" 不要在下一个Delphi启动时加载此包 " ...
即使我卸载,清理我的包...在我重新编译并成功重新安装后:Delphi向我显示我的组件已成功编译和注册的消息(已识别并添加了一些新组件:TMyComponents).
我"希望"当我再次加载我的测试项目时,我的组件仍然会出现在我的表单上,但是我收到的消息是"找不到类TMyComponent.忽略错误并继续?注意:这可能会删除组件或丢失的属性值"
然后我检查菜单:"组件/安装包",我的包出现在列表中,但它是"未选中".如果我手动检查它并加载我的项目,我的组件就在那里,一切都好.如果我重新启动delphi,程序包将再次取消选中并仍然被禁用.
当我像往常一样启动Delphi时,如何重新激活此包以加载? (DELPHI-2009)
我正在从TMS学习组件。我得到了“ ... rtl100.bpl找不到...”。如果我使用包含“ rtl”的“使用运行时程序包构建”,可能会发生此错误。
rtl100.bpl在哪里(我正在使用D2007)?我该怎么办才能解决此错误?
为DELPHI应用程序实现外部模块系统的最佳方法是什么?
我真正需要的是非常基本的:
我需要在其他表单中使用商店表单,并且只能作为standAlone使用
我用的是这样的东西
if Assigned(pNewClass) then begin
Application.CreateForm(pNewClass, _lFrm);
_lFrm.Hide;
_lFrm.BorderStyle := bsNone;
_lFrm.Parent := pBasePNL //(TPanel);
_lFrm.Align := alClient;
end;
Run Code Online (Sandbox Code Playgroud)
所以我创建了一个TForm,但将它放在TPanel中.
对于DataModules,我通常存储ImageLists,因此ideia是改变应用程序ICO只是改变外部模块.
那么实现这一目标的最佳方法是什么?
看看运行时BPL,但似乎不明白如何做到这一点.谢谢.
更新:.....................................
在阅读了一些相关的问题和答案后,我想我找到了答案和解决方案.
http://edn.embarcadero.com/article/27178
这篇文章是旧的东西,但非常简单.
那么逻辑就在那里我似乎没有得到它来显示表格
我只是测试例子2
它加载BPL,但没有得到表单:
AClass := GetClass('TForm2');
Run Code Online (Sandbox Code Playgroud)
总是检索'nil'
但BPL注册时:
RegisterClass(TForm2);
Run Code Online (Sandbox Code Playgroud)
任何人都可以帮助这个.
我有一个应用程序加载一个简单形式的BPL.
此表单是主应用程序的可选选项.
BPL正确加载,表单显示正确,但我不知道如何访问bpl中表单的公共方法和属性.
有谁可以提供一个简单的例子?
我的代码:
// Load the BPL on aplication Load
LoadPackage( 'About.bpl' );
// CAll for TForm1 inside the About.BPL
var
AClass: TClass;
AForm: TForm;
begin
AClass := GetClass('TForm1');
if AClass <> nil then
begin
Application.CreateForm(TComponentClass(AClass), AForm);
AForm.Show;
end;
// The unit TForm1 inside the BPL package
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;
type
TForm1 = class(TForm)
Button1: TButton;
Label1: TLabel;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public …Run Code Online (Sandbox Code Playgroud) 我正在考虑使用动态加载BPL并将主应用程序中的对象实例传递给BPL中的方法.这造成应用程序和BPL使用的问题单元.
我写了一个小小的原型,它做了这个,并很好奇Delphi如何内部管理应用程序中定义的类与BPL之间的差异.
例如,说一个基本的Widget类,如:
TmyWidget = class
private
fId:Integer;
fDescription:String;
public
procedure DoSomething1();
end;
Run Code Online (Sandbox Code Playgroud)
现在,应用程序和BPL是使用包含TmyWidget类的单元构建的.之后,TMyWidget中的某些内容发生了变化,应用程序被重建,但是BPL不是(反之亦然.)我添加了另一个方法DoSomething2()并在应用程序中创建了一个TmyWidget实例并将其传递给BPL进行处理并在基本的例子,它的工作原理.但它显然充满了潜在的问题.
如果另一个动态加载的BPL也使用TmyWidget,那么事情变得更加有趣.它似乎工作,但它绝对不是理想的.
主要问题是 - 如何通常将对象传递给主应用程序和DLL或BPL?我以前从来没有尝试过,而且可能有充分的理由,但我有这个想法适合这种方法......
我想最好的方法是序列化对象并将这些字节传递并在DLL/BPL中反序列化,此过程注意到主机和动态加载模块之间可能存在的版本差异,但我希望新的SimpleSharedMem选项可能会带来这个新功能而没有序列化的开销,但它似乎不是很有用,除非你严格保持app和dll重建任何共享代码更改......但在这个原型中,应用程序将保持相当稳定并且动态加载的模块将经常更改,并将功能添加到TmyWidget.(服务器应用程序充当基于客户端请求构建TmyWidget的工厂,应用程序将实例传递给各个模块进行处理.)
我有一个BPL项目(有一些基础东西)和一个EXE项目,它在其搜索路径中有另一个项目输出的位置(BPL和DCP).当使用"Build With Runtime Packages"构建EXE项目时,它构建正常.但是,它需要我部署EXE和BPL.到现在为止还挺好.
因为我宁愿只部署EXE(无论它变大),我猜我只是取消选中"Build With Runtime Packages"并且就是这样,但事实并非如此.它不会构建,并开始抱怨缺少的类.我可以编译EXE项目的唯一方法是将实际BPL项目的DCU路径添加到EXE项目的搜索路径中.我可以这样做,但为什么我被迫指向DCU?德尔福不能把它们从BPL中拿走吗?这不只是一个品味的问题,如果我走这条路,并链接到DCU,当谈到属于表格的DCU时,它会询问我表格DFM,迫使我也将我的来源文件夹包含在EXE中项目的搜索路径,现在它们似乎正在编译,这是令人望而却步的.每次我想编译我的EXE项目时,我都无法重新编译我的BPL项目代码库.
我希望我已经说清楚了.
如何实现标题中提出的任何帮助表示赞赏.
谢谢.