大家好!我问题的简单模型是这样的:主窗体,上面一个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;
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;
另外:
redt1.Text:=GetBLText;
主窗体中GetBLText并没有加载动态链接库中的函数
//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: 貌似你的分给得太少了,所以高手们都看不上!
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,要用到什么知识才来找,麻烦了...
在点击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;
[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.
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;