痛苦了很久,上午终于没什么问题了,虽然还有一些地方的一些概念仍然不是很明白.
把我自己的程序贴出来,一是希望给和我一样的菜鸟作为参考,二来希望高手们也能参与讨论,把这个问题解决得尽善尽美
以下的代码其实主要是从网上找到的,自己也琢磨了琢磨,我是菜鸟,希望大家别笑话。一,DLL中的代码:library JC_EditKL;uses
ShareMem,
Forms,
ActiveX,
Windows,
SysUtils,
Classes,
EditKL_frm in 'EditKL_frm.pas' {frmEditKL};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(frmEditKL) then
begin
Application := ParentApplication;
frmEditKL := TfrmEditKL.Create(nil);
frmEditKL.MyParentForm := ParentForm;
frmEditKL.MyParentApplication := ParentApplication;
end;
end;{$R *.res}
exports
ProvaChild;
begin
DLLApplication:=Application;
DLLProc:=@DLLUnloadProc;
end.二,主程序中调用的代码:T_ProvaChild=procedure(ParentApplication:TApplication;ParentForm:TForm);stdcall;//写在public区procedure TfrmMain.LoadDll(DllName:string);
var
ProcAddr:FarProc;
ProvaChild:T_ProvaChild;
begin
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;procedure TfrmMain.N_XGDLKLClick(Sender: TObject);
begin
LoadDll('JC_EditKL.DLL');
end;
三,主程序和DLL都带包编译。如果用到了QueriRep控件,带的包应该是:vcl;rtl;qrpt。
在发布程序的时候,需要一起发布的包有:vclx70.bpl,vcl70.bpl,rtl70.bpl,qrpt70.bpl,dbrtl70.bpl,bdertl70.bpl,当然,我用了ADO控件,如果不用也许会少一些,可以一个一个试,
把我自己的程序贴出来,一是希望给和我一样的菜鸟作为参考,二来希望高手们也能参与讨论,把这个问题解决得尽善尽美
以下的代码其实主要是从网上找到的,自己也琢磨了琢磨,我是菜鸟,希望大家别笑话。一,DLL中的代码:library JC_EditKL;uses
ShareMem,
Forms,
ActiveX,
Windows,
SysUtils,
Classes,
EditKL_frm in 'EditKL_frm.pas' {frmEditKL};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(frmEditKL) then
begin
Application := ParentApplication;
frmEditKL := TfrmEditKL.Create(nil);
frmEditKL.MyParentForm := ParentForm;
frmEditKL.MyParentApplication := ParentApplication;
end;
end;{$R *.res}
exports
ProvaChild;
begin
DLLApplication:=Application;
DLLProc:=@DLLUnloadProc;
end.二,主程序中调用的代码:T_ProvaChild=procedure(ParentApplication:TApplication;ParentForm:TForm);stdcall;//写在public区procedure TfrmMain.LoadDll(DllName:string);
var
ProcAddr:FarProc;
ProvaChild:T_ProvaChild;
begin
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;procedure TfrmMain.N_XGDLKLClick(Sender: TObject);
begin
LoadDll('JC_EditKL.DLL');
end;
三,主程序和DLL都带包编译。如果用到了QueriRep控件,带的包应该是:vcl;rtl;qrpt。
在发布程序的时候,需要一起发布的包有:vclx70.bpl,vcl70.bpl,rtl70.bpl,qrpt70.bpl,dbrtl70.bpl,bdertl70.bpl,当然,我用了ADO控件,如果不用也许会少一些,可以一个一个试,
解决方案 »
- 自动发邮件提示,并将内容显示在邮件中
- 怎样写触发器?
- 请教以函数方式给数组赋值的写法?
- 关于excel里的内容导到sqlserver数据库的 问题÷÷÷÷
- 用TWebBrowser做的浏览器,在浏览网页时总会跳出“脚本错误信息”,怎样屏蔽它。还有该浏览器使用一段时间后总会提示“Mshtml.dll”异常
- 有关创建文件的问题,sos!
- 散分问一个很简单的问题!!(在线等)
- 怎么通过clinetdataset发送如此数据报文?
- 怎样使得STRINGGRID中的某列CELL变成下拉列表框输入?????
- 在制做报表时如何在一页显示多行,怎样给列加边框
- Delphi 接受ASP传回多个字段信息疑问~(在线等,有答案立即给分结帖)
- 一个简单问题
function NoneModalCreate(AppHandle:THandle):THandle;
var
MyHandle:THandle;
begin
Application.Handle:=AppHandle;
MyHandle:=THandle(TDLLForm.Create(Application));
Result:=MyHandle;
with TDLLForm.Create(Application) do
try
show;
except
Free;
Result:=0;
Raise;
end;
end;
不传Handle,看你怎么释放