如果不带包编译,不会出什么错误,但回车和tab会失效
如果带包编译,就会出现冲突错误,说什么rtl70.bpl冲突
请问大家,带包编译时,在打勾那里都要写哪些包?是不是我打包有问题?还是代码有什么问题呢?主程序调用dll的代码:T_ProvaChild=procedure(ParentApplication:TApplication;ParentForm:TForm);stdcall;
.....
procedure TfrmMain.LoadDll(DllName:string);
var
ProcAddr:FarProc;
ProvaChild:T_ProvaChild;
begin
//if DLLHandle <> 0 then FreeLibrary(DLLHandle);
DLLHandle:=LoadLibrary(PChar(DllName));
if DLLHandle<>0 then
begin
ProcAddr:=GetProcAddress(DLLHandle,'ProvaChild');
if Assigned(ProcAddr) then
begin
ProvaChild:=ProcAddr;
ProvaChild(Application,self);
end;
end;
end;
以下是DLL中的代码var
DLLApplication:TApplication;Procedure DLLUnloadProc(Reason:Integer);Register;
begin
if Reason=DLL_PROCESS_DETACH then Application:=DllApplication;
end;procedure ProvaChild(ParentApplication:TApplication;ParentForm:TForm);export;stdcall;
begin
CoInitialize(nil);
DLLApplication:=Application;
if not assigned(frmPJCK) then
begin
Application := ParentApplication;
frmPJCK := TfrmPJCK.Create(nil);
frmPJCK.MyParentForm := ParentForm;
frmPJCK.MyParentApplication := ParentApplication;
end;
end;{$R *.res}
exports
ProvaChild;
begin
DLLApplication:=Application;
DLLProc:=@DLLUnloadProc;
end.
如果带包编译,就会出现冲突错误,说什么rtl70.bpl冲突
请问大家,带包编译时,在打勾那里都要写哪些包?是不是我打包有问题?还是代码有什么问题呢?主程序调用dll的代码:T_ProvaChild=procedure(ParentApplication:TApplication;ParentForm:TForm);stdcall;
.....
procedure TfrmMain.LoadDll(DllName:string);
var
ProcAddr:FarProc;
ProvaChild:T_ProvaChild;
begin
//if DLLHandle <> 0 then FreeLibrary(DLLHandle);
DLLHandle:=LoadLibrary(PChar(DllName));
if DLLHandle<>0 then
begin
ProcAddr:=GetProcAddress(DLLHandle,'ProvaChild');
if Assigned(ProcAddr) then
begin
ProvaChild:=ProcAddr;
ProvaChild(Application,self);
end;
end;
end;
以下是DLL中的代码var
DLLApplication:TApplication;Procedure DLLUnloadProc(Reason:Integer);Register;
begin
if Reason=DLL_PROCESS_DETACH then Application:=DllApplication;
end;procedure ProvaChild(ParentApplication:TApplication;ParentForm:TForm);export;stdcall;
begin
CoInitialize(nil);
DLLApplication:=Application;
if not assigned(frmPJCK) then
begin
Application := ParentApplication;
frmPJCK := TfrmPJCK.Create(nil);
frmPJCK.MyParentForm := ParentForm;
frmPJCK.MyParentApplication := ParentApplication;
end;
end;{$R *.res}
exports
ProvaChild;
begin
DLLApplication:=Application;
DLLProc:=@DLLUnloadProc;
end.
解决方案 »
- .......................................................................................
- adoconnection赋值问题
- 关于方便粉丝的通告!谁下的毒?
- DELPHI局域网SQL-SERVER
- 过年了,还是有一个简单问题好象用SQL语句写不出来,大家帮忙看看?
- 问一个字符处理的问题
- 大家用Delphi 开发,主要应用于哪方面,小弟最近想学Delphi ,但没有什么方向
- fastreport 如何做分组汇总和总汇总
- 如何读取两个MOUSE或键盘点击事件之间的时间间隔数。
- 怎样捕捉窗口被大小化的事件?
- 关于获取U盘ID的老问题了
- 添加的 Events 为什么没 反映 怎么添加事件
貌似文本框有哪些都就编译哪些啊,只是部署的时候要把这些包一个一个全找出来,部署到一起。
编译的时候提示rtl70.bpl冲突?建议你用其他机器的Delphi编译试试。
我再把问题说具体些:
打开第一个DLL子窗体正常,这是再打开另外一个DLL子窗体就出现上面的错误
我再把问题说具体些:
打开第一个DLL子窗体正常,这是再打开另外一个DLL子窗体就出现上面的错误
哦,那我把程序这样修改,看如何:
DLL: DLLApplication:TApplication;Procedure DLLUnloadProc(Reason:Integer);Register;
begin
if Reason=DLL_PROCESS_DETACH then Application:=DllApplication;
end;procedure ProvaChild(ParentApplication:TApplication;ParentForm:TForm);export;stdcall;
begin
CoInitialize(nil);
DLLApplication:=Application;
if not assigned(frmPJCK) then
begin
Application := ParentApplication;
frmPJCK := TfrmPJCK.Create(nil);
//frmPJCK.MyParentForm := ParentForm;
//frmPJCK.MyParentApplication := ParentApplication;
end;
end;{$R *.res}
exports
ProvaChild;
begin
//DLLApplication:=Application;
//DLLProc:=@DLLUnloadProc;
end.
包也就是dll,只是把类和全局变量导出了而已,类似与MFC扩展dll一样。
例如你有vcl.bpl,你如果带包编译了a.dll和b.dll,那他们的Application就都是用的vcl.bpl中的那个。
如果你没有带包编译,那a.dll和b.dll就都会把Forms.pas给编译一次,因此Application变成了两份。
library NormalForm;uses
SysUtils,
Classes,
Forms,
Windows,
uChild in 'uChild.pas' {frmDLLForm};{$R *.res}var
DLLApp: TApplication;
DLLScr: TScreen;
procedure CreateDLLForm(App: TApplication; Scr: TScreen);
begin
Application := App;
Screen := Scr;
TfrmDLLForm.Create(nil);
end;procedure ExitDLL(Reason: Integer);
begin
if Reason = DLL_PROCESS_DETACH then
begin
Application := DLLApp;
Screen := DLLScr;
end;
end;
exports
CreateDLLForm;begin
DLLApp := Application;
DLLScr := Screen;
DLLProc := @ExitDLL;
end.