动态包使用问题,那位高手帮忙啊..(200分)

  • 主题发起人 主题发起人 蓝叶菱
  • 开始时间 开始时间

蓝叶菱

Unregistered / Unconfirmed
GUEST, unregistred user!
最近看李维的老帖子,关于动态包的使用问题...
不知道为什么我的函数没有取到这个类...
procedure TFrmMain.LoadMyPackage;
begin
try
FModule:=LoadPackage('dclDM.bpl');
LoadDataModule;
except
on E:Exception do begin
ShowMessage('出错了!错误号码:'+E.Message);
Abort;
end;
end;
end;

procedure TFrmMain.FormActivate(Sender: TObject);
begin
LoadMyPackage;
end;

procedure TFrmMain.LoadDataModule;
var
iCount:integer;
begin
DataModuleClass:=GetClass('TDM');
if DataModuleClass<>nil then //存在该类开始创建TDATAMOUDLE,为什么取到的类是空的?这里居然跳过...
begin
admGlobal:=TDataModule(TComponentClass(DataModuleClass).Create(Application));
for iCount:=0 to admGlobal.ComponentCount-1 do begin
if UpperCase(admGlobal.Components[iCount].ClassName)='TAdoQuery' then begin
aQuery:=TADOQuery(admGlobal.Components[iCount]);
ds.DataSet:=aQuery;
aQuery.Connection.Open;
ds.DataSet.Open;
break;
end;
end;//for
end;
end;
代码地址:
http://www.xazjj.gov.cn/westsky2/packdemo.rar
 
包的装载必须确认成功! 类注册没有??
 
有没有RegisterClass?
 
初始化部分得 registerClass(TDM)
 
unit uDM;

interface

uses
SysUtils, Classes, DB, ADODB;

type
TDM = class(TDataModule)
AdoConn: TADOConnection;
QQuery: TADOQuery;
procedure DataModuleCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
DM: TDM;

implementation

{$R *.dfm}
procedure TDM.DataModuleCreate(Sender: TObject);
begin
AdoConn.Open;
QQuery.Open;
end;

initialization
RegisterClass(TDM);
//finalization //去掉它,先手动卸载
// UnRegisterClass(TDM);
end.//已经注册了.
 
各位大侠,教教小弟了.
QQ:360446276
 
有没有加stdcall;
下面是一个小例子。
type
TUIPackageForm = class(TForm)
DataSource1: TDataSource;
DBNavigator1: TDBNavigator;
DBGrid1: TDBGrid;
procedure FormClose(Sender: TObject
var Action: TCloseAction);
private
{ Private declarations }
public
{ Public declarations }
end;

procedure ShowMDIChildForm(MainApp:TApplication);stdcall;
exports
ShowMDIChildForm;
var
UIPackageForm: TUIPackageForm;
implementation
{$R *.DFM}
procedure ShowMDIChildForm(MainApp:TApplication);stdcall;
begin
Application:=MainApp;
UIPackageForm:=TUIPackageForm.Create(MainApp);
UIPackageForm.Show;
end;
procedure TUIPackageForm.FormClose(Sender: TObject;
var Action: TCloseAction);
begin
Action := cafree;
end;
动态调用的主程序部分。
type
Tshowmdiform=procedure(MainApp:TApplication);stdcall;

showmdiform:Tshowmdiform;
begin
UIConnect := LoadPackage('bpl');
showmdiform:=getprocaddress(UIConnect,'ShowMDIChildForm');
if (@showmdiform<>nil) then
showmdiform(application)
else showmessage('no prc');
end;
 
这个问题在于我在BPL中注册了类TDM,但是我调用的时候,根本没有,好像这个没有注册一样.
GetClass没有调用到
也就是说GetClass('TDM')=NIL,.....是真。。。。
 
BPL 的什么地方注册的 ?
initialization 机制 D2006 和 D7不同,D7 默认会执行包全部单元的这个部分

而 D2006 只在 自己USES到的时候 才执行
 
不过我确实没在d6动态装载包! 如果如楼上所说那就uses 一下看看
 
看一下路径问题,上一次,我也是出现这种问题,不过最后发现是路径的问题
 
对,感觉还是没有加载成功。Uses一下看了...
Delphi的包动态加载其实应该和DLL机制是一样的,之所以不能GetClass('TDM')=NIL,我想应该还是没有加载成功吧,但是不知道为什么没有触发异常...
(我没有试过,是从楼主的代码来分析的)
 
多人接受答案了。
 
注册只要是从持久化类派生下来的就可以registerclass.

你静态引用包看看可不可以. 如果静态引用还有问题, 那么肯定是那个bpl的问题了.
 
后退
顶部