首页
社区
课程
招聘
[求助]DELPHI dll封装问题
发表于: 2009-10-21 18:54 4755

[求助]DELPHI dll封装问题

2009-10-21 18:54
4755
我是将myDll.pas(FORM)封装在abc.dll里。。。

  myDll in 'myDll.pas' {Form1};

procedure newForm;stdcall;export;
var
  frm1:TForm1;
begin
    frm1:=TForm1.Create(nil);
    frm1.Show;
end;

然后用主程序 123.pas 调用"newForm"过程。。myDll.pas Form能正常显示出来。但按上面的按钮功能。就出现“Access violation at address 004E105F in module 'abc.dll'.Read of address 00000460”错误提示

如果将abc.dll改成这样写却能正常使用。。。我搞不懂这样写有什么区别。。
  myDll in 'myDll.pas' {Form1};

procedure newForm;stdcall;export;
begin
    Form1:=TForm1.Create(nil);
    Form1.Show;
end;

我想实现的功能:是主程序 123.pas 有8个按钮。。每点击一个按钮就调用 newForm 动态生成一个 myDll.pas Form ...
所以想用第一种方法定义窗口来加以区分:
var
  frm1,frm2,frm3,frm4,frm5,frm6,frm7,frm8:TForm1;

如果按第二种方法的虽然也能正常动态创建8个 myDll.pas Form 但没办法区分开来。我想显示/隐藏哪个窗口都无法判断。。。

麻烦大家给个方法。。。可以不按我上面所说的。。能实现相同功能就行了

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 296
活跃值: (89)
能力值: ( LV15,RANK:340 )
在线值:
发帖
回帖
粉丝
2
这就是你要的,每个DLL窗口创建时,将指针返回给应用程序就可以控制了。处理很简单,具体看代码中的注释。
myDll.dpr 是DLL,DLLTest.dpr是测试用程序(只演示了两个窗口的显示、隐藏操作)
上传的附件:
2009-10-21 23:44
0
雪    币: 216
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
你好~~~试了一下你的方法和我写的第一种方法一样。。点了窗口上的按钮。也会出现错误提示
“Access violation at address 004E105F in module 'abc.dll'.Read of address 00000460”错误提示
2009-10-22 01:16
0
雪    币: 216
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
发现问题所在。。被封装在dll里mydll.pas 里定义了
var
  Form1: TForm1;

而别的线程如mydllunit2.pas 要使用 Form的控件时,都要这样写 Form1.edtYjID.Text

从而造成上面的错误。。这个该如何改?
2009-10-22 14:38
0
雪    币: 296
活跃值: (89)
能力值: ( LV15,RANK:340 )
在线值:
发帖
回帖
粉丝
5
定义了
var
  Form1: TForm1;

也没关系啊,如果你不是非要DLL外部操作窗体,可以直接使用原来的定义。只是你估计忘了初始化,直接用了Form1这个变量,才出现访问违规。
看这个例子,DLL里的Form2读写Form1内Edit1.Text,应该就是你要的。
上传的附件:
2009-10-22 20:39
0
雪    币: 216
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我指的不是这个。。。

麻烦木桩 大侠再看看。。。再指点一下。。。

主程序:Project1.dpr(unit1.pas)

DLL:mydll.dpr

要封装在DLL里的程序:frmModule.dpr(主线程:frmModule.pas 还有三线程:frmModuleUnit2.pas,frmModuleUnit3.pas,frmModuleUnit4.pas)
-----  比如:像frmModuleUnit2.pas线程要访问控件时,我都使用form1.edit1.Text

想实现的效果:
    主程序:Project1.dpr(unit1.pas)  实现动态创建两个frmModule.dpr FORM

--------------------------------------------------------------------------------------------------------

问题:
    如果按你最原先的方法:frm1, frm2: TForm;
      这样就会造成frmModuleUnit2.pas线程访问控件,form1.edit1.Text时。。就会出问题:
“Access violation at address 004E105F in module 'abc.dll'.Read of address 00000460”错误提示

如果按frm1, frm2: TForm;定义,应该是frm1.edit1.Text才可以访问。。。。。

一大堆内容,不知道木桩大侠能否看的明白。。。

我只想实现上面的功能。。。如果能不用DLL最好。。麻烦指点一下
2009-10-22 23:04
0
雪    币: 296
活跃值: (89)
能力值: ( LV15,RANK:340 )
在线值:
发帖
回帖
粉丝
7
抱歉,我还是没看懂你要表达的意思,建议你重新整理一下所需要实现的功能,重新发一遍。
我只能根据你上面描述的猜测下你要实现的功能,不知道你是不是想:在单独的线程里,分别操作两个由同一模版类动态生成的窗口里的控件?

这么说可能比较绕口,举个例子:
比如Form1和Form2两个窗口,都是由 TFormModule 这个模版类动态创建的,并且 TFormModule 上面有个Edit控件。
不知你是否是想在外部的xxxThread里,分别修改Form1和Form2里的Edit控件?
2009-10-23 20:55
0
游客
登录 | 注册 方可回帖
返回
//