大家好!我问题的简单模型是这样的:主窗体,上面一个RichEdit,一个Button1,单击Button1后弹出DLL中的窗体 ;
                          DLL窗体,上面就只有一个Button2,单击Button2后,关闭DLL窗体,然后把一字符串返回到主窗体中的RichEdit中,而RichEdit就自动显示DLL窗体中传过来的字符串我的大致代码如下,遇到的问题是主窗体的RichEdit不能获得DLL窗体中传过来的字符串:dll窗体的代码:function GetBLText(): string; stdcall;
procedure CreateBLForm(aHandle: THandle); stdcall;var
  Text: string;
implementation{$R *.dfm}procedure CreateBLForm(aHandle: THandle);stdcall;
var
  Form2: TForm2; //声明窗体变量
begin
  Application.Handle := aHandle;
  Form2 := TForm2.Create(Application);
  try
    Form2.ShowModal;
  finally
    Form2.Free;
  end;
end;function GetBLText(): string; stdcall;
begin
  Result := Text;
end;procedure TForm2.Button1Click(Sender: TObject);
begin
  Text := '窗体数据传递测试';
  GetBLText;
  Close;
end;procedure TForm2.Button2Click(Sender: TObject);
begin
  Close;
end;
主窗体中的代码:  ......
  TCreateBLForm = procedure(aHandle: THandle); stdcall; //声明两次,这里为第一次
  TGetBLText = function(): string; stdcall;
    .......
procedure TForm1.btn3Click(Sender: TObject);
var
  LibHandle: THandle;
  CreateBLForm: TCreateBLForm;
begin
  LibHandle := LoadLibrary('ViewCode.DLL');
  try
    @CreateBLForm := GetProcAddress(LibHandle, 'CreateBLForm');
    if not (@CreateBLForm = nil) then
    begin
      CreateBLForm(Form1.Handle);
      redt1.Text:=GetBLText;
    end;
  finally
    FreeLibrary(LibHandle); //   Unload   the   DLL.
  end;
end;

解决方案 »

  1.   

    加个消息处理就行, 调用的时候把句柄传过去,,DLL处理完再发个消息给主程序.
      

  2.   

    顶!
    另外:
    redt1.Text:=GetBLText;   
    主窗体中GetBLText并没有加载动态链接库中的函数
      

  3.   


    //dll中接受窗体的句柄函数:
    function SetHwnd(hwnd: HWND): Boolean; stdcall;
    begin
      h := hwnd;
      Result := True;
    end;//dll窗体中向主窗体传参数:
    const
      WM_MyMessage = WM_User + 1;var
      Form2: TForm2;
      h: HWND;implementation{$R *.dfm}procedure TForm2.Button1Click(Sender: TObject);
    begin
      PostMessage(h, WM_MyMessage, 0, Integer(PChar('Test')));
      Close;
    end;//主窗体中接受dll窗体中传递的参数:
    const
      WM_MyMessage = WM_User + 1;//接受消息的过程声明:
    procedure MyMessage(var msg: TMessage); message WM_MyMessage;procedure TForm1.MyMessage(var msg: TMessage);
    begin
      Edit1.Text := PChar(msg.LParam);
    end;这样,主窗体就能获得Dll窗体中返回的数据了!PS: 貌似你的分给得太少了,所以高手们都看不上!
      

  4.   

    继续请教//dll中接受窗体的句柄函数:
    function SetHwnd(hwnd: HWND): Boolean; stdcall;
    begin
      h := hwnd;
      Result := True;
    end;
    请问这个函数是定义在dll中的,还是在DLL窗体的pas中的 ?应该如何调用它 ?另procedure TForm1.MyMessage(var msg: TMessage);
    begin
      Edit1.Text := PChar(msg.LParam);
    end;
    这个消息过程又是应该如何调用的 ?呵呵,不好意思哦...都不怎么熟悉Delphi,要用到什么知识才来找,麻烦了...
      

  5.   

    function SetHwnd(hwnd: HWND): Boolean; stdcall;   定义在dll中procedure MyMessage(var msg: TMessage); message WM_MyMessage;  写在窗体的private之前
    在点击dll窗体按钮关闭时,执行了以下过程:procedure TForm2.Button1Click(Sender: TObject);
    begin
      PostMessage(h, WM_MyMessage, 0, Integer(PChar('Test')));
      Close;
    end;它向句柄为h的窗体发送了消息procedure TForm1.MyMessage(var msg: TMessage);
    begin
      Edit1.Text := PChar(msg.LParam);
    end;
    这个过程是窗体负责接受自定义消息类型——WM_MyMessage类型的消息,只要有此类型的消息发过来,它就会接受。而你的程序中发送消息的时机就是你关闭dll窗体的时候而句柄h是在主窗体的一个激活Dll窗体的按钮事件中写的:procedure TForm1.Button2Click(Sender: TObject);
    var
      aForm: TForm;
    begin
      SetHwnd(Self.Handle);
      aForm := GetForm('TForm2').Create(nil);
      aForm.ShowModal;
      FreeAndNil(aForm);
    end;
      

  6.   

    谢谢merrymin兄的解答,我按照你的提示去修改,可还是得不到结果,现在我将我的所有代码贴上来,望指正,谢谢令这代码procedure MyMessage(var msg: TMessage); message WM_MyMessage; 会提示
    [Error] Unit2.pas(14): Undeclared identifier: 'WM_MyMessage' 请问是什么原因 ?//DLL代码
    library dll;uses
      Windows,
      Unit2 in 'Unit2.pas' {Unit2Form};{$R *.res}
    function SetHwnd(hwnd: HWND): Boolean; stdcall;
    begin
      h := hwnd;
      Result := True;
    end;exports
      CreateBLForm,
      SetHwnd;begin
    end.//DLL窗体代码
    unit Unit2;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, ComCtrls;type
      TForm2 = class(TForm)
        btn1: TButton;
        edt1: TEdit;
        procedure btn1Click(Sender: TObject);
      private
        { Private declarations }  public
        { Public declarations }
      end;
    //定义过程
    procedure CreateBLForm(aHandle: THandle); stdcall;const
      WM_MyMessage = WM_User + 1;var
      Text: string;
      h: HWND;
    implementation{$R *.dfm}procedure CreateBLForm(aHandle: THandle);stdcall;
    var
      Form2: TForm2; //声明窗体变量
    begin
      Application.Handle := aHandle;
      Form2 := TForm2.Create(Application);
      try
        Form2.ShowModal;
      finally
        Form2.Free;
      end;
    end;procedure TForm2.btn1Click(Sender: TObject);
    begin
      PostMessage(h, WM_MyMessage, 0, Integer(PChar('Test')));
      Close;
    end;end.
    //主窗体代码
    unit Unit1;interfaceuses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls;type
      TCreateBLForm = procedure(aHandle: THandle); stdcall; //声明两次,这里为第一次  TForm1 = class(TForm)
        edt1: TEdit;
        btn1: TButton;
        procedure btn1Click(Sender: TObject);
        procedure MyMessage(var msg: TMessage);
      private
        { Private declarations }
      public
        { Public declarations }
      end;const
      WM_MyMessage = WM_User + 1;var
      Form1: TForm1;implementationprocedure CreateBLForm(aHandle: THandle); stdcall; external 'dll.dll' name 'CreateBLForm';
    function SetHwnd(hwnd: HWND): Boolean; stdcall;external 'dll.dll' name 'SetHwnd';{$R *.dfm}procedure TForm1.MyMessage(var msg: TMessage);
    begin
      Edt1.Text := PChar(msg.LParam);
    end;procedure TForm1.btn1Click(Sender: TObject);
    var
      LibHandle: THandle;
      CreateBLForm: TCreateBLForm;
    begin
      SetHwnd(Self.Handle);
      LibHandle := LoadLibrary('dll.DLL');
      try
        @CreateBLForm := GetProcAddress(LibHandle, 'CreateBLForm');
        if not (@CreateBLForm = nil) then
          CreateBLForm(Form1.Handle);
      finally
        FreeLibrary(LibHandle); //   Unload   the   DLL.
      end;
    end;end.
      

  7.   

    主窗体中:const
      WM_MyMessage = WM_User + 1;
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        Timer1: TTimer;
        Button2: TButton;
        procedure Button1Click(Sender: TObject);
        procedure FormCreate(Sender: TObject);
        procedure Timer1Timer(Sender: TObject);
        procedure Button2Click(Sender: TObject);
        procedure MyMessage(var msg: TMessage); message WM_MyMessage;
      

  8.   

    主窗体中接受消息的过程必须写明消息类型:procedure MyMessage(var msg: TMessage); message WM_MyMessage;
      

  9.   

    问题得到解决,谢谢谢谢merrymin兄的解答。分数虽少...无奈家穷