我是用dll封装mdi窗口,现在遇到两个问题,
1,点击菜单会重复加载,childcount一直为0。
2,时间长了去关闭窗口,会报地址错误。
我是用loadlibrary引用dll的,然后在dll文件里,
procedure dllunloadproc(reason : Integer);register;
begin
  if (reason = dll_process_detach) or (reason = dll_process_attach) then
    begin
      dllapplacation := Applaction;
      dllScreen := Screen;
    end;
end;

解决方案 »

  1.   

    这个是很久以前的一个例子。procedure ProvaChild(ParentApplication: TApplication; ParentForm: TForm); export; stdcall;
    var
      Form1: TForm1;  
      DllProc: Pointer;             { Called whenever DLL entry point is called }begin
       Application:=ParentApplication;   Form1:=TForm1.Create(ParentForm);
       Form1.MyParentForm:=ParentForm;
       Form1.MyParentApplication:=ParentApplication;
    //   windows.SetParent(Form1.Handle,ParentForm.Handle);
    //   Form1.FormStyle:=fsMDIChild;
       Form1.Show;
    end;procedure DLLUnloadProc(Reason: Integer); register;
    begin
      if Reason = DLL_PROCESS_DETACH then  Application:=DllApplication;
    end;
      

  2.   

    Form1.MyParentForm:=ParentForm;
       Form1.MyParentApplication:=ParentApplication;这个比PARENTFORM多了一个保存旧有PARENTFORM的过程。
      

  3.   

    1. 估计是传进去的SCREEN没用好!
    2. 时间长了关闭报错,时间短了不报吗?没道理吧?肯定还是操作中创建了什么没有释放吧!
      

  4.   

    NewFang兄,我也有这个想法,应该是screen的问题,但我对这个东西不太明白,创建什么没有释放问题应该不是,我的form是空的,不会创建什么,能给我讲一下screen的高级用法吗?本来我传它,是为了,控制重复引用的问题的,但又用不好
      

  5.   

    我的错误是,Access violation at address 024D6AD3 in module 'Basic.dll'.Read of address 00000254
    是真的,时间长了,关闭的时候就报错,如果你再引用一下这个dll,就不会报错,但时间长了又出错了
      

  6.   

    我想会不会是dll文件里的错误
    我是这样写的。
    var
       DllApplication:TApplication;
       DllScreen:TScreen;
    {$R *.res}
    procedure DllUnLoadProc(Reason: Integer);register;
      begin
        if (Reason = DLL_PROCESS_DETACH) or (Reason = DLL_THREAD_DETACH)then
        begin
          Application := DllApplication;
          Screen := DllScreen;
        end;
      end;
    exports Show_Form;begin
      DllApplication := Application;
      DllScreen := Screen;
      DllProc := @DLLUnloadProc;
    end.