怎么在DLL动态创建控件? 急...在线等候 ( 积分: 50 )

  • 主题发起人 主题发起人 softdelphi8
  • 开始时间 开始时间
S

softdelphi8

Unregistered / Unconfirmed
GUEST, unregistred user!
现在把代码全部列出来,请大家帮助解决出现错误的地方
Unit Unit1;

Interface

Uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls;

Type
TForm1 = Class(TForm)
Button1: TButton;
Panel1: TPanel;
Procedure Button1Click(Sender: TObject);
Private
{ Private declarations }
Public
{ Public declarations }
End;

Type
TCreateControl = Function(AppHandle: THandle; AOwner: TComponent;
PControl: TWinControl): TEdit; stdcall;
EDLLLoadError = Class(Exception);

Var
Form1: TForm1;

Implementation

{$R *.dfm}

Procedure TForm1.Button1Click(Sender: TObject);
Var
LibHandle: THandle;
CreateControl: TCreateControl;
Begin
LibHandle := LoadLibrary('DLLPro.dll');
Try
If LibHandle = HINSTANCE_ERROR Then
Raise EDLLLoadError.Create('Unable to Load DLL');
@CreateControl := GetProcAddress(LibHandle, 'CreateControl');
If Not (@CreateControl = Nil) Then
[red]CreateControl(Application.Handle, Nil, Panel1);[/red] // 调用DLL后出错
Finally
FreeLibrary(LibHandle);
End;
End;

End.
上面的代码是EXE主程序调用

下面是DLL代码:
Library DLLPro;

Uses
ShareMem,
SysUtils,
StdCtrls,
ExtCtrls,
Controls,
Forms,
Classes;

{$R *.res}

Function CreateControl(AppHandle: THandle; AOwner: TComponent;
PControl: TWinControl): TEdit; Stdcall;
Var
Edit1: TEdit;
Begin
Application.Handle := AppHandle;
Edit1 := TEdit.Create(AOwner);
Edit1.Parent := PControl;
Edit1.Text := 'DLL Create Edit1';
Edit1.Name := 'Edit1';
Edit1.Left := 100;
Edit1.Top := 100;
Result := Edit1;
End;

Exports
CreateControl;

Begin
End.
 
将DLL和Exe的Build with runtime packages 打勾
 
打上了,执行后大约3秒后就出错。
 
什么错误,delphi7 8.1+winxp 没问题
 
这是DELPHI7+WIN2000

我的[red]目标是通过DLL对EXE主程序FORM里Panel创建控件[/red]。
最好是不要返回TEDIT,因为Panel会创建很多控件。
 
还是出现错误:
Cannot assign a TFont to a TFont

代码全部列出来了,
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3837570
 
Edit1 := TEdit.Create(AOwner);

AOwner: TComponent
 
还是出现错误:
Cannot assign a TFont to a TFont
 
CreateControl(Application.Handle, Nil, Panel1);
这个调用明显有问题呀,这里怎么会是Nil呢,编辑框Edit1的Owner属性是nil那么谁释放他的内存啊?所以存在内存泄漏,应改写为:
CreateControl(Application.Handle, Self, Panel1);
所有Edit1的Owner全部是主窗口,那么在主窗口释放时统一释放内存。最好再写个函数来释放Edit1内存,否则内存占用会多一些。
 
按你的意思加后,还是出现错误:
Cannot assign a TFont to a TFont
 
试试 加上
Application.Handle := AppHandle;
Edit1 := TEdit.Create(AOwner);
Edit1.ParentFont := False;//这个
Edit1.Parent := PControl;
Edit1.Text := 'DLL Create Edit1';
Edit1.Name := 'Edit1';
Edit1.Left := 100;
Edit1.Top := 100;
Result := Edit1;
 
Edit1.ParentFont := False;//这个加了,还是会出错。
lake_cx,帮助
 
首先感谢Devchenxip, 问题是得到结果了。
但将dll和exe的Build with runtime packages 打勾时,就有新的问题来了,因为我的应用程序都没有将Build with runtime packages 打勾,否则要制作安装程序包才能让客户端运行这就麻烦了。
请不要对将dll和exe的Build with runtime packages 打勾,解决这个打勾在此非常感谢了!!!
 
此人为垃圾,经常在群里发垃圾,请不要再回答此人问题了。
 
但将dll和exe的Build with runtime packages 打勾时,就有新的问题来了,因为我的应用程序都没有将Build with runtime packages 打勾,否则要制作安装程序包才能让客户端运行这就麻烦了。
请不要对将dll和exe的Build with runtime packages 打勾,解决这个打勾在此非常感谢了!!!
 
TCreateControl = Function(AppHandle: THandle; AOwner: TComponent;
PControl: TWinControl): TEdit; stdcall;
这里有一个常识性的错误!
在DLL里是没有delphi的类型输出的!标准的微软的Dll输出的都是无类型指针。
你的上面的这种定义只能应用于delphi的环境,另外delphi的生成的包是可以的。
 
AOwner没有指定,试试指定一下。
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3838290
 
我现在不要打勾,但要运行不出错。请问怎么解决!!!
 
后退
顶部