1.  @DLLSub := GetProcAddress(HandleCall, 'CreateForm');
    红色部分的我想给其传递参数,但不知这个参数如何传递,什么类型2.   @DLLSub := GetProcAddress(HandleCall, 'CreateForm');
     if Assigned(DLLSub) then
     begin
      DLLForm := DLLSub(Application, Screen);
     end;
     FreeLibrary(HandleCall);
     调用后在此就立即FreeLibrary释放有没什么问题?    

解决方案 »

  1.   

    1.  @DLLSub := GetProcAddress(HandleCall, 'CreateForm'); 
      得到的是指向DLL中的函数的指针即DLL中CreateForm函数指针,传递参数是通过dllsub传递的
    2.  try
         ...
          @DLLSub := GetProcAddress(HandleCall, 'CreateForm'); 
          if Assigned(DLLSub) then 
          begin 
            DLLForm := DLLSub(Application, Screen); 
          end;
        finally 
          FreeLibrary(HandleCall);
        end; 
      

  2.   

    function CaDllOpen(frm:string):string;
    ...
    begin
    ...
        @DLLSub := GetProcAddress(HandleCall,frm);
    ...
    endprocedure TQG_MAIN.CA_LHExecute(Sender: TObject);
    begin
    CaDllOpen('CreateForm')
    end;这样报错,停留在@DLLSub := GetProcAddress(HandleCall,frm);这行,如果直接用@DLLSub := GetProcAddress(HandleCall, 'CreateForm'); 则OK
    ,不知如何传递该参数,你可试下
      

  3.   

     DLLForm := DLLSub(Application.handle, Screen);红色不用传吧,是Tscreen吗?
     
      

  4.   

    1.  @DLLSub := GetProcAddress(HandleCall, 'CreateForm'); 
      得到的是指向DLL中的函数的指针即DLL中CreateForm函数指针,传递参数是通过dllsub传递的  如何将这个参数动态传进来,请明示2.    finally 
          FreeLibrary(HandleCall);  这个我知道,我调用后不用try ... finally,调用后直接释放会存在什么问题??
    但动态调用的DLL窗体(dll中有很多窗体)关闭时,如何马上就释放掉当前DLL的窗体
      

  5.   

    1中的'CreateForm'其实是DLL中的一个窗体名,我DLL中有很多窗体,需要传入一个参数进来这个公共过程来打开不同的DLL中的窗体,所以需要动态传入这个参数
      

  6.   


    procedure CallCpl(ProcName:string);
    var
      applet: TCPLApplet;
      hinst: Hmodule;
    begin
      hinst:= LoadLibrary('inetcpl.cpl');
      if hinst<>0 then begin
        @applet := GetProcAddress(hinst, PChar(ProcName));
        if @applet<> nil then
          applet(Form1.Handle, CPL_DBLCLK, 0, 0);
      end
      else
        ShowMessage('invalid handle');
      FreeLibrary(hInst);
    end;procedure TForm1.Button1Click(Sender: TObject);
    begin
      CallCpl('CPlApplet');
    end;
      

  7.   

    在DLL中你需要定义一个导出函数,比如
    procedure ShowCreateForm(AHandle: THandle);
    var
      CreateForm: TCreateForm;
    begin
      Application.Handle := AHandle;
      CreateForm := TCreateForm.Create(Application);
      try
        CreateForm.ShowModal();
      finally
        CreateForm.Free();
        CreateForm := nil;
      end;end;在你exe中
    @DLLSub := GetProcAddress(HandleCall, 'ShowCreateForm'); 
    if Assigned(@DLLSub ) then 
        begin 
         ShowCreateForm(Application.handle); 
        end; 
        FreeLibrary(HandleCall); 
      

  8.   

    JeffChung 谢谢,原来要用Pchar第二个问题中关闭DLL中的某个窗体后,如果释放呢,主窗体怎样知道DLL中的窗体已经关闭
      

  9.   

    使用回调函数吧。看看下面的帖子也许对你有帮助。
    http://topic.csdn.net/t/20021022/12/1114409.html
      

  10.   

    谢谢楼上热心帮助,我在调用了DLL中的某个fsMDIChild窗体后,为什么一操作和数据库相关的就会报内存错误(比如移记录或编辑),感觉很奇怪的问题
      

  11.   

    com没有初始化?是不是要用CoInitialize初始化?(我没做过,随便猜测的