如果不带包编译,不会出什么错误,但回车和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.

解决方案 »

  1.   

    不带包编译的时候要把主程序(exe)中的Application, Screen 对象相应替换掉 DLL 中的; 带包编译的时候 build with runtime packages 选中, 并且删除Build with runtime packages下面文本框里面的所有内容.
      

  2.   

    你带包编译还要Application := ParentApplication;这个干嘛?
    貌似文本框有哪些都就编译哪些啊,只是部署的时候要把这些包一个一个全找出来,部署到一起。
    编译的时候提示rtl70.bpl冲突?建议你用其他机器的Delphi编译试试。
      

  3.   

    错误提示:A Class named TQuickRep already exits
    我再把问题说具体些:
    打开第一个DLL子窗体正常,这是再打开另外一个DLL子窗体就出现上面的错误
      

  4.   

    错误提示:A Class named TQuickRep already exits
    我再把问题说具体些:
    打开第一个DLL子窗体正常,这是再打开另外一个DLL子窗体就出现上面的错误
      

  5.   

    带包编译就不需要Application := ParentApplication?是不是带包编译就不用穿application?
    哦,那我把程序这样修改,看如何:
    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.
      

  6.   

    带包编译是不用传那些,但即使传递了那些也不会出错,因为他们本来就是一样的。
    包也就是dll,只是把类和全局变量导出了而已,类似与MFC扩展dll一样。
    例如你有vcl.bpl,你如果带包编译了a.dll和b.dll,那他们的Application就都是用的vcl.bpl中的那个。
    如果你没有带包编译,那a.dll和b.dll就都会把Forms.pas给编译一次,因此Application变成了两份。
      

  7.   


    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.
      

  8.   

    这个才是关键,因为QuickRep的单元中存在RegisterClass,如果此部分代码不是被共享的话(各个DLL,如果EXE也用到了QuickRep的话,则也要带上QuickRep的包),就会出注册错误。
      

  9.   

    我在主程序也带上了QuickRep的包,似乎好了,但是主程序并没有使用QuickRep呀?真是奇怪,,