我想创建使用tform作为参数的dll,简单的计划是,如果该表单传递给dll,则dll文件返回包含组件名称的数组。
可以将tform作为参数传递吗?
答案 0 :(得分:6)
您的进程中很可能会有两个VCL实例,一个用于主机exe,另一个用于DLL。这是一个太多的例子。来自主机exe的TForm类与DLL中的TForm类不同。
基本规则是除非所有模块都使用相同的VCL / RTL运行时实例,否则不能跨模块边界共享VCL / RTL对象。实现这一目标的方法是使用软件包链接到VCL / RTL。
答案 1 :(得分:1)
我假设你有一个框架,你在表格上有一个TMemo:
声明两种类型:
type
PTform = ^TForm;
TStringArray = array of string;
并使这些对EXE和DLL都可见
.DPR实施部分:
procedure dllcomplist(p_pt_form : PTForm;
var p_tx_component : TStringArray);
stdcall;
external 'dllname.dll';
...
var
t_tx_component : TStringArray;
t_ix_component : integer;
...
Memo1.Lines.Add('Call DLL to return componentlist');
dllcomplist(pt_form,t_tx_component);
Memo1.Lines.Add('Result in main program');
for t_ix_component := 0 to pred(length(t_tx_component)) do
Memo1.Lines.Add(inttostr(t_ix_component) + '=' + t_tx_component[t_ix_component]);
setlength(t_tx_component,0);
和DLL的.DPR
...
procedure dllcomplist(p_pt_form : PTForm;
var p_tx_component : TStringArray);
stdcall;
var
t_ix_component : integer;
t_ix_memo : integer;
t_tx_component : TStringArray;
begin with p_pt_form^ do begin
setlength(t_tx_component,componentcount);
setlength(p_tx_component,componentcount);
for t_ix_component := 0 to pred(componentcount) do
begin
t_tx_component[t_ix_component] := components[t_ix_component].Name;
p_tx_component[t_ix_component] := components[t_ix_component].Name;
if components[t_ix_component].ClassName = 'TMemo' then
t_ix_memo := t_ix_component;
end;
Tmemo(components[t_ix_memo]).lines.add('Within DLL...');
for t_ix_component := 0 to pred(componentcount) do
Tmemo(components[t_ix_memo]).lines.add(inttostr(t_ix_component) + ' '
+ t_tx_component[t_ix_component]);
Tmemo(components[t_ix_memo]).lines.add('DLL...Done');
setlength(t_tx_component,0);
end;
end;
...
exports dllcomplist;
{好 - 这比严格要求更复杂。我正在做的是在调用程序中建立一个动态数组,将其填入DLL然后在调用者中显示结果
和
检测DLL中的TMemo并将来自DLL中相同动态数组的数据写入来自调用者的TMemo - 以显示数据相同}