不能向Dll中的函数传递TDataSource参数吗?(50分)

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

softdog

Unregistered / Unconfirmed
GUEST, unregistred user!
在Dll中的一个DBGrid的参数由外部传入,但是执行下面的代码是老出错:<br><br>dll中:<br><br>procedure ShowDataForm(AHandle: THandle; ADataSource:TDataSource);<br>...<br>with TDataForm.Create(Application) do<br>try<br>&nbsp; DBGrid.DataSource:=ADataSource;<br>&nbsp; ShowModal;<br>finally<br>&nbsp; free;<br>end;<br><br>当执行到ShowModal这句时,出错提示: Invalidate pointer operation.<br>但是如果把这个函数移到普通的单元中,就不会出错。<br>为什么?
 
提前一下。<br><br>分数不够可以再加。
 
可能是这样,ADataSource是一个指针,指向原对象的地址,当原对象传入DLL时候,原对象释放,<br>ADataSource就指不到实际的内容。改成<br>DBGrid.DataSource.assign(ADataSource);<br>试验一下。<br><br>
 
我传递参数后,原对象并没有释放。<br>我估计是Win32内存管理的方式的原因,传入的地址和实际的地址可能是两个不同的内存区域。
 
我踢、踢、踢!往前踢!
 
有没有 TDataForm.OnShow 事件,有的话里面做了什么?
 
to Pipi:<br>没有OnShow,和这有关吗?
 
我想你的问题不是在这里,因为我也同样的用过这代码,但都是好好的,找找其它<br>与之相关的地方,我想你能查出问题。
 
有位高手兄台建议只传DataSource的NAME,再用findCommpent来操作它,我没试过.老兄可试试
 
有个问题很奇怪,如果传递TADOConnection参数就可以,而且在exe和dll中只有一个ADOConnection的实例,<br>这是为什么?<br><br>to hay:能把你的源码发给我一份吗?这里怎么试都不行啊!你是向dll中传递TDataSource参数吗?
 
to softdog:<br>&nbsp; 我试过了,确实有这个问题。是因为exe 和 dll 之间相互传递了 long string 的缘故。<br>exe 和 dll 使用了不同的 MemoryManager 导致这个问题。解决的办法是使用 Sharemem<br>单元和 shareMM.dll。<br>1、在你的 exe 的 project 单元中加上对 sharemem 单元的引用,如:<br>program test;<br><br>uses<br>&nbsp; Sharemem, &nbsp;//加上 sharemem,并且必须作为在第一个引用单元。放在最前面。<br>&nbsp; Forms,<br>&nbsp; Unit1 in 'Unit1.pas' {Form1};<br>{$R *.RES}<br>begin<br>&nbsp; Application.Initialize;<br>&nbsp; Application.CreateForm(TForm1, Form1);<br>&nbsp; Application.Run;<br>end;<br>2、同样地,你的 Dll 的 Project 单元中也要加上对 sharemem 单元的引用,如:<br><br>Library ShowDll;<br>uses<br>&nbsp; Sharemem, &nbsp;//加上 sharemem,并且必须作为在第一个引用单元。放在最前面。<br>&nbsp; SysUtils,<br>&nbsp; Classes,<br>&nbsp; DataForm in 'Unit1.pas' {DataForm};<br>export ShowDataForm;<br>{$R *.RES}<br>begin<br><br>end; &nbsp;<br>3、发布以上 exe 和 dll 文件时必须同时发布 shareMM.dll 这个 dLL(Delphi 安装自带的)。<br>这样就行了。其实在 Wizard 生成的 Dll Project 单元中自动添加的注释中对这个要注意<br>的地方也作了说明。
 
对、对<br>bbkxjy说的对。<br>在Delphi5程序员指南中多次强调过这个问题。
 
接受答案了.
 
后退
顶部