gpt4 book ai didi

dll - 从 DLL 在主窗体 (EXE) 中创建对象

转载 作者:行者123 更新时间:2023-12-02 10:48:25 26 4
gpt4 key购买 nike

我正在尝试在 DLL 中创建一个 TButton 对象以在 EXE 主窗体中显示它。这是我的代码:

动态链接库:

library dlltest1;

{$mode objfpc}{$H+}

uses
Classes,sysutils,Forms,Interfaces,StdCtrls,Windows,Dialogs
{ you can add units after this };
function test(hand:TForm):HWND;

var
a:TButton;
begin
a:=TButton.Create(hand);
a.Show;
a.Caption:='a';
result:=a.Handle;
end;

exports test;
begin
end.

执行文件:

  procedure test(hand:HWND);  external 'dlltest1.dll';
type

{ TForm1 }

TForm1 = class(TForm)
Button1: TButton;
TIPropertyGrid1: TTIPropertyGrid;
procedure Button1Click(Sender: TObject);
procedure FormCreate(Sender: TObject);
private

public

end;

var
Form1: TForm1;

implementation

{$R *.lfm}

{ TForm1 }
type TComp=function(Hand:HWND):HWND;
var
comps:array of TComp;

procedure TForm1.FormCreate(Sender: TObject);
begin
end;

procedure TForm1.Button1Click(Sender: TObject);
var
a:HWND;
begin
SetLength(comps,1);
a:=LoadLibrary('dlltest1.dll');
comps[0]:=TComp(GetProcAddress(a,'test'));
(FindControl(comps[0](Form1.Handle)) as TButton).Caption:='A';
end;

它使用命令 comps[0](Form1.Handle) 成功创建按钮,但是当我尝试执行此 (FindControl(comps[0](Form1.Handle)) 作为 TButton 时).Caption:='A'; ,它说 INVALID TYPE CAST。我检查了主 exe 中的类名。ClassName 是 TButton。我正在 Windows 的 Lazarus IDE 下编译这两个项目x86_64.我还尝试使用 RTTI TPropertyEditor Grid。当我像这样分配它时:TIPropertyEditor1.TIObject:=FindControl(comps[0](Form1.Handle)) TIPropertyEditor1 的行为就像正常的 TButton 一样。但我不明白为什么“as TButton”会导致无效的类型转换。我的问题有什么解决方案吗?

最佳答案

包(如 BPL 包)在主干中处理,但尚未运行。设计时组件被编译到 IDE 二进制文件中(这也具有 Lazarus 更快启动等优点)

如果没有使用普通的.so/dll,除了身份问题之外,DLL和主程序都具有RTL及其状态的完整副本,其中包括内存管理器、VMT、RTTI、本地化等。在这种情况下,托管类型或一个模块分配而另一个模块取消分配的任何情况都是危险的。 AS 情况使用类类型信息,每个模块也是重复的。

另请参阅http://wiki.freepascal.org/packages一篇简短的论文。

P.s. David 基本上是对的,Lazarus 的状态与 Delphi 大致相同,只是还没有工作包,也没有共享内存管理器概念来解决这个问题。

关于dll - 从 DLL 在主窗体 (EXE) 中创建对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51264798/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com