痛苦了很久,上午终于没什么问题了,虽然还有一些地方的一些概念仍然不是很明白.
把我自己的程序贴出来,一是希望给和我一样的菜鸟作为参考,二来希望高手们也能参与讨论,把这个问题解决得尽善尽美
以下的代码其实主要是从网上找到的,自己也琢磨了琢磨,我是菜鸟,希望大家别笑话。一,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控件,如果不用也许会少一些,可以一个一个试,