我要在执行程序中动态的调用dll中的窗体类。
窗体类类名从执行程序传入,然后把dll中对应的窗体show出来。
谢谢。

解决方案 »

  1.   

    http://www.chinaaspx.com/archive/delphi/3382.htm
      

  2.   

    看了你给的代码,貌似没有解决我的问题
    dll中的窗体创建的时候,类名没有从外部传入啊。
    如果dll中封装了多个窗体,外部程序怎么才能动态的指定要创建哪个呢?
      

  3.   

    一般来讲DLL中不应该出现窗体的吧,如果需要出现窗体最好写dpk包吧!
    按照你的要求窗体的创建和showmodal都是应该在DLL完成的其中还包括了窗体的释放
    将这些操作封装为函数然后在外部的程序中直接调用该函数来操作就可以了
      

  4.   

    angle你说的方法我也试过,如果在dll方法中直接指定要show哪个窗体是没问题的。
    但是如果这个方法加上参数(类名),然后由外部程序调用时传入参数,在ShowModal的时候就会报内存错误。这是是dll中的输出方法:
    procedure showform(frm:string);stdcall;
    var
      TheForm:TForm;
    begin
      try
        TheForm:=TForm(getclass(frm)).Create(nil);
        TheForm.ShowModal;
      finally
        FreeAndNil(TheForm);
      end;
    end;传入的类所对应的窗体我已经注册过了:
    initialization
      RegisterClass(TFrmDLL002);
    finalization
      UnregisterClass(TFrmDLL002);
    这是执行程序的调用代码:
    procedure TForm1.Button2Click(Sender: TObject);
    var
      rp: ShowDll002;
    begin
      iHandle := SafeLoadLibrary(PChar('DLL002\Prjdll002.dll'));
      if iHandle = 0 then begin
        showmessage('DLL002无法加载!');
        Exit;
      end;  try
        try
          @rp := GetProcAddress(iHandle, 'showform');
          if Assigned(@rp) then begin
            rp('TFrmDLL002');
          end else begin
            showmessage('加载了非法程序!');
          end;
        except
          raise;
        end;
      finally
        FreeLibrary(iHandle);
      end;
    end;是否这种方案行不通?不行的话我就只能转用bpl调用了,谢谢。